[파이썬] XML-RPC 파일 업로드 시 큰 파일 올리기 Develop Tip

파이썬의 XML-RPC에서 파일 업로드를 위한 코드는 어렵지 않습니다.

서버의 코드에서는

def server_receive_file(self, filename, arg):
print "server_receive_file_append(%s) called!" % (filename,)
with open("%s.log"%filename, 'wb') as ofp:
ofp.write(arg.data)
return True
와 같이 주어진 파일을 저장만 하면 되고

보내는 입장에서는

with open(filename, "rb") as ifp:
binary_data = xmlrpclib.Binary(ifp.read())
proxy.server_receive_file(filename, binary_data)
라고 하면 됩니다.

그러나 여기에 함정이 존재합니다.

바로, 큰 데이터 (1GB 이상)를 보내려고 할 때 발생합니다.
우선 보내는 클라이언트는 한꺼번에 파일을 읽어 메모리에 넣고
그것을 패러미터화 시켜 서버에 보냅니다.
서버는 서버대로 메모리에 받아 그것을 저장하려고 합니다.

이것을 아래 와 같이 수정하였더니 아무리 커도 잘 동작했습니다.

def server_receive_file2(self, filename, cnt, arg):
print "server_receive_file_append(%s, cnt=%s) called!" % (filename, cnt)
wmode = 'wb' if cnt == 0 else 'ab'
with open("%s.log"%filename, wmode) as ofp:
ofp.write(arg.data)
return True
cnt 패러미터를 하나 더 보내어, 처음 (0) 일 때만 'wb' 모드로 파일을 열고
나머지는 모두 append 시킵니다.

이제는 보내는 코드 입니다.

with open(filename, "rb") as ifp:
cnt = 0
for chunk in iter(lambda: ifp.read(1024*1024), b''):
binary_data = xmlrpclib.Binary(chunk)
proxy.server_receive_file2(filename, cnt, binary_data)
cnt += 1
filename 에 해당하는 파일을 1MB(1024*1024) 씩 읽어
server_receive_file2 를 호출합니다.

이렇게 하면 아무리 커도 메모리를 최대 1MB 정도 이용하며
보낼 수 있습니다.


어느 분께는 도움이 되셨기를...





덧글

  • 2016/05/30 00:03 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 지훈현서아빠 2016/05/30 07:56 #

    안녕하십니까. 좋은 글 잘 읽었습니다.
    저는 26년 째 개발이라는 것을 하면서 잘난 사람이 아니라
    무언가 생각하고 있는 것을 꾸준히 그리고 포기하지 않고 하다보면
    스스로의 길이 보인다고 믿고 앞으로 10년간은 더 열심히 일 해 보고자 합니다.
    그런 모습을 옆에서 이렇게 좋게 봐 주시니 고마울 따름이구요.
    그리고 제가 당부드리고 싶은 말은,
    수많은 기술과 수많은 정보들 사이에서
    진정 자신의 길이 무엇이고 무엇을 남들 보다 더 잘해서
    세계적인 경쟁력을 가질까를 염두에 두고 십년 정도를
    매진하시다 보면 분명 길이 보일 것이 생각합니다.
    (적어도 제게 있어서는 이런 이런 것을 하면 되겠구나 하는 눈이 생겼다는 경험이었습니다)
    저도 아직도 부족한게 많고 아직도 공부해 가면서 살아가고 있습니다.
    꾸준히 그리고 끝까지 계속 공부하시고 또 그 지식을 이용하여
    다른 많은 사람들에게 보탬이 되시는 것을 해 주셨으면 합니다.
    저도 두서 없었네요...^^
    다시 한번 감사드립니다.
  • 2016/05/30 11:22 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 2016/05/30 11:26 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 지훈현서아빠 2016/05/30 15:55 #

    판교까지 오려면 일부러 먼 걸음을 해야 할것 아닌가요?
    뭐 아무때고 괜찮은 저녁 시간 있으면 문자로 함 물어보셔요.
    저는 개인적으로 이런 오프만남을 소중하게 여기고 있답니다.
    정말로 중요한 것은 얼마를 많이 알고 있는 가가 아니라
    자신이 부족한 것이 많으니 많이 배우고 익히려는 자세라 생각합니다.
    파이팅 하셔요~~!!!
댓글 입력 영역

구글애드텍스트