2014-12-12 3 views
1

나는 소켓 호출에 의해 호출 한 후에 수신 크기를 지정함으로써 파이썬에서 호출을 받아들이도록 최적화하려고합니다. 나는 6 바이트의 헤더를 받는다. (처음에는 4 개가 공백이고, 마지막 2 개는 빅 엔디안이다.) 아이디어는 내가 원하는 메시지의 크기를 얻으려면 첫 번째 6 바이트의 압축을 풀고 그 결과 정수 값으로 수신 버퍼를 해당 특정 값으로 설정하고 소켓을 읽고 결과를 즉시 내 목록에 추가합니다. 다음은 제 코드입니다.socket.recv()에서 데이터를 효율적으로 언팩하는 방법은 무엇입니까?

문제가 발생하면 테스트 결과가 무작위로 반환됩니다. 가끔은 10 가지 항목의 목록을 얻습니다. 때로는 100 가지 가끔 예상되는 값이 있습니다. 수신 버퍼를 4096으로 설정하면 항상 정확한 답을 받았습니다. 그러나 이렇게하면서, 나는 "".join() 나의 목록과 나의 열을 얻기 위해 값 비싼 문자열 조각을 수행해야만한다. 이제는 수백/수천 개의 결과 집합과 큰 차이가 없습니다. 문제는 각 행이 2500+ 문자 주위에있는 수십만 또는 수백만 레코드의 "조인 된"목록을 통해 작업 할 때 처리 시간이 증가하기 시작한다는 것입니다.

스트림에서 바로 목록을 채우면 소켓 호출이 부풀어 지지만 많은 시간이 걸릴 것이 아니라 전반적으로 시간을 절약 할 수 있습니다. 어떤 생각이라도 대단히 감사하겠습니다. 파이썬 2.7.8/Mac 및 2.7.8/리눅스

답변

1

여기서 문제에서 실행

socket.recv() 호출이 항상 인자로 주어진 바이트 수를 읽어 가정이다. 실제로, 이하로을 읽을 수 있습니다. 앱이 사용되기를 기다리는 순간 OS 네트워크 스택 버퍼에서 사용할 수있는 것이 무엇이든간에. 이는 스트림에서 프로토콜 메시지의 정렬을 효과적으로 중단시킵니다.

응용 프로그램 수준에서 소켓 호출과 버퍼의 양쪽에서 반환 된 크기를 확인해야합니다.

참고 : 지정하지 않았지만 여기서는 예외 처리 블록에서 "스트림"을 언급 한 것으로 가정합니다.

+0

아, 내 생각에 내가 어리석은 것처럼 보였습니다. 그럼에도 불구하고, 당신은 정확합니다, 이것은 TCP 스트림입니다. 자, 내가 너를 정확히 이해했다면,이 버퍼 검사를 추가하면 오버 헤드가 추가 될 것인가? 비슷한 것을 할 수있는 패턴이 있습니까? 나는 언제나 내가 할 수있는 한 Pythonic으로서 노력한다. – Carlos

+0

답변에 대해 더 생각해 보면, 현재 두렵게 진행되고있는 것을 이해하고 있습니다. 내 논리는 기껏해야 매우 힘들며 버퍼의 추가 검사를 구현하고 적절하게 받아야합니다. 내가 수집 한 것으로부터, 내 소켓 논리는 탐욕스럽고 더 자세히 조사 될 필요가있다. 정말로 당신의 대답을 즐겼고, 그것을 더 철저히 생각하게했습니다. – Carlos

+1

"오버 헤드"가되는 적절한 체크를하지는 않을 것입니다. 당신은 당신의 프로그램이 가장 먼저, 그리고 빨리 시작되기를 원한다. 깨진 확대/축소 코드에 대한 실제 사용법이 없습니다. –

관련 문제