2016-03-31 17 views
0

ile sıkıştırın Bir REST son noktasından veri okuyan ve sonra verileri S3'e yazılmadan önce geçici olarak sıkıştırılmış bir dosyaya kaydeden bir veri dışa aktarma işim var. Bu daha küçük yükleri için çalışıyordu:REST son noktasından etkin bir şekilde okuyun ve sonucu 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) 

Ancak, veri boyutu ben bir kerede çok fazla veri yazıyorum göstermek için görünen bir hata var arttıkça:

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

Denedim REST son noktadan satır-by-satır okumak için kod değiştirme ve her satırı dosyaya yazmak, ancak bu son nokta, bunu işlemek için kurulum olmadığından, inanılmaz derecede yavaştı.

# 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) 

yapmak için daha verimli bir şekilde, birinci örnekte olduğu gibi, aynı anda tüm yük okuyarak olarak, var, ancak daha sonra verimli bir şekilde hemen bellekte bulunan veri hattı-satır okuma?

cevap

0

Bu, StringIO'nun ne için olduğu ortaya çıkıyor. Yükümüzü bir StringIO nesnesine dönüştürerek, ondan satır satır okuyabilir ve herhangi bir hata olmadan bir gzip dosyasına yazdım.

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) 
İlgili konular