2015-11-09 4 views
0

Мне дали несколько файлов, которые были заархивированы, но разархивированы 30 ГБ + и были заархивированы в Windows. Я пытаюсь создать систему с использованием экземпляров EC2, чтобы разархивировать их, но я сохраняю максимальную память (ошибка IOError: [Errno 28] No space left on device). Мой сценарий unzip выглядит следующим образом:Проблема с распаковкой чрезвычайно больших файлов

import boto3 
from boto3.s3.transfer import S3Transfer 
from zipfile import ZipFile as zip 
import ec2metadata 
import re 

s3 = boto3.client('s3') 
transfer = S3Transfer(s3) 


def get_info(): 
    userdata = re.findall(r"\=(.*?) ", ec2metadata.get('user-data')) 
    global dump_bucket 
    dump_bucket = userdata[0] 
    global bucket 
    bucket = userdata[1] 
    global key 
    key = userdata[2] 
    return dump_bucket, bucket, key 

def unzipper(origin_bucket, origin_file, dest_bucket): 
    s3.download_file(bucket, key, '/tmp/file.zip') 

    zfile = zip('/tmp/file.zip') 

    namelist = zfile.namelist() 

    for filename in namelist: 
     data = zfile.read(filename) 
     f = open('/tmp/' + str(filename), 'wb') 
     f.write(data) 
     f.close() 

    transfer.upload_file('/tmp/' + str(filename), dump_bucket, namelist[0]) 

def main(): 
    get_info() 
    unzipper(dump_bucket, bucket, key) 

main() 

Есть ли способ распаковать файл? Я попробовал потоковое воспроизведение, но это вряд ли сработает из-за того, что он был изначально сжат.

+4

Вы посмотрели ответ здесь http://stackoverflow.com/a/339506/69893? Кроме того, 'IOError: свободного места на устройстве вообще не означает, что вы исчерпали свое дисковое пространство. «MemoryError» означает, что вы исчерпали системную память. –

+0

Помимо ошибки, вы просто читаете байты из элементов в zip-файле без разжатия. – erandac

ответ

0

Я смог решить это, увеличив доступную память, часть проблемы также исходила из кодировки. Так что пришлось менять кодировку по умолчанию на latin-1