从S3打开大文件

时间:2017-04-11 13:51:22

标签: dask

当我尝试从S3打开一个大文件时,出现内存错误。

import dask.dataframe as dd
df = dd.read_csv('s3://xxxx/test_0001_part_03.gz', storage_options={'anon': True}, compression='gzip', error_bad_lines=False) 

df.head()
exception: MemoryError

如何直接从S3打开大型压缩文件?

2 个答案:

答案 0 :(得分:1)

简短回答

您无法执行此单个大型压缩文件,因为gzip压缩不允许随​​机访问。

长答案

通常包含大文件Dask将提取固定大小的数据块,如128MB,并独立处理它们。但是,像GZip这样的某些压缩格式不允许像这样轻松进行分块访问。如果你有许多小文件,你仍然可以使用Dask GZip数据,但每个文件将被视为一个块。如果这些文件很大,那么您将遇到内存错误。

可以使用dask.bag,这通常非常适合流式传输结果。你不会得到Pandas的语义,你不会在一个文件中得到任何并行性。

答案 1 :(得分:0)

您可能已经遇到过几个简单的解决方案:

  • 将文件存储在S3解压缩;可能有更大的文件大小和相应的慢转移
  • 下载到本地解压缩文件;当然,你需要有足够的本地存储空间。

后者可以如下实现

import s3fs, gzip
s3 = s3fs.S3FileSystem(anon=True)
with s3.open('s3://xxxx/test_0001_part_03.gz', 'rb') as f1:
    with open('local_file', 'wb') as f2:
        f3 = gzip.GzipFile(fileobj=f1, mode='rb')
        out = True
        while out:
            out = f3.read(128*2**10)
            f2.write(out)
相关问题