2016-03-31 21 views
0

私は、RESTエンドポイントからデータを読み込んでS3に書き込まれる前に一時圧縮ファイルにデータを保存するデータエクスポートジョブを持っています。これは、より小さなペイロードのために働いていた:効率的にRESTエンドポイントから読み取り、Pythonで結果を圧縮

import gzip 
import urllib2 

# Fails when writing too much data at once  
def get_data(url, params, fileobj): 
    request = urllib2.urlopen(url, params) 
    event_data = request.read() 
    with gzip.open(fileobj.name, 'wb') as f: 
     f.write(event_data) 

ただし、データサイズが、私は一度にあまりにも多くのデータを書いて示すように思われるエラーました増加として:

File "/usr/lib64/python2.7/gzip.py", line 241, in write self.fileobj.write(self.compress.compress(data)) OverflowError: size does not fit in an int

私が試しを行ごとにRESTエンドポイントから読み取って各行をファイルに書き込むようにコードを変更しましたが、おそらくエンドポイントがそれを処理するようにセットアップされていないため、これは非常に遅いです。

# Incredibly slow 
def get_data(url, params, fileobj): 
    request = urllib2.urlopen(url, params) 
    with gzip.open(fileobj.name, 'wb') as f: 
     for line in request: 
      f.write(line) 

これを行うには、より効率的な方法は、最初の例のように、一度にペイロード全体を読んで、その後効率的になりましメモリにあるデータから、ライン・バイ・ラインを読んだことなどによって、ありますか?

答えて

0

これは、StringIOが何であるかを示しています。私のペイロードをStringIOオブジェクトに変換することで、行単位で読み込み、gzippedファイルにエラーなく書き込むことができました。

from StringIO import StringIO 

def get_data(url, params, fileobj): 
    request = urllib2.urlopen(url, params) 
    event_data = StringIO(request.read()) 
    with gzip.open(fileobj.name, 'wb') as f: 
     for line in event_data: 
      f.write(line) 
関連する問題