2016-07-01 2 views
0

파이썬 소켓 프로그래밍에 대한 질문이 있습니다. 나는 소켓에 익숙하지 않아서 어떻게 작동하는지 잘 모른다. 파이썬 응용 프로그램을 실행하는 동안 두 컴퓨터간에 이진 파일을 전송해야하며 일부 소켓 프로그래밍을 수행하는 것이 시스템 명령 scp 또는 netcat을 수행하는 것보다 빠르거나 빠를 것이라고 생각했습니다. 그러나 어떤 이유로 기계에서 1GB 이미지를 전송하는 데 14 초 정도 걸립니다. 나는 SCP를 통해 그것을하면 약 9 걸립니다. 이것은 SCP가 악명 높게 느리기 때문에 이상하게 보입니다. 나는 나의 전송 속도가 netcat에 필적 할 것이기를 바라고 있었지만, 나는 이것을 달성하는 데 어려움을 겪고있다.느린 파이썬 소켓 전송

서버 :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((socket.gethostname(), 50000)) 
s.listen(1) 

img = open('test.img', 'rb') 

client, addr = s.accept() 
l = img.read(4096) 

while(l): 
     client.send(l) 
     l = img.read(4096) 

img.close() 
s.close() 

클라이언트 : 이것은 분명히 매우 기본이고 기능과 예외 처리를 많이 부족하지만 적어도 (천천히하지만) 전송할 파일을 얻을 수

host = '' 
port = 50000 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 

img = open('./newimg.img', 'wb') 

l = s.recv(4096) 

while(l): 
    img.write(l) 
    l = s.recv(4096) 

img.close() 
s.close() 

. 나는 분명히 '호스트'변수와 같은 코드에서 몇 가지 세부 사항을 제거했다.

어떻게 향상시킬 수 있습니까?

감사합니다.

+0

TCP_NODELAY를 설정하십시오. send/recv 차단 문제가 있다면 조금 도움이 될 것입니다. – Arnial

답변

0

버퍼 크기를 4096에서 큰 크기로 늘리십시오. 이렇게하면 항목을 사용하면 스택 작업 및 파이썬 해석 횟수가 줄어들어 데이터 전송 속도가 빨라질 수 있습니다.

현재 4096 (4K) 바이트 읽기에서 1 기가 바이트 파일의 소켓에서 262144 읽기/쓰기를 수행하게됩니다. 버퍼를 1048576 바이트 (1024K)로 늘릴 수 있다면 1 기가 바이트 파일에 대해 소켓과 파일로부터 1024 읽기/쓰기 만있을 것입니다. 그러면 시스템 호출의 최적화 된 코드가 더 많은 노력을 기울일 수 있습니다. 얼마만큼의 RAM 메모리가 사용 가능한지 알지 못하기 때문에 가능한 한 큰 것으로 만드는 것이 도움이되지만 약간의 여유를두고 약간의 메모리를 남겨 두는 것이 좋습니다.

예를 들어 내가 사용한 한 시스템에서 소량의 데이터를 보내고 예상 한 성능을 얻을 수 없었습니다. 적은 양의 데이터를 하나의 큰 메시지에 대기시키고 필요한 성능을 얻을 수있었습니다. 최선을 다해서 우리는 소량의 스택을 통해 앞뒤로가는 시스템 기능을 호출하는 시간 로그를 문제의 일부로 사용하고 있다고 판단 할 수있었습니다.

그러나 scp는 컴파일 된 머신 코드이므로 더 빠를 가능성이 있으며 추가 오버 헤드가 있어도 해석 할 필요가 없을 수 있습니다.

0

한 번에 더 많은 바이트를 수신하도록 s.recv()의 버퍼 크기를 늘리십시오.