当我尝试从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打开大型压缩文件?
答案 0 :(得分:1)
您无法执行此单个大型压缩文件,因为gzip压缩不允许随机访问。
通常包含大文件Dask将提取固定大小的数据块,如128MB,并独立处理它们。但是,像GZip这样的某些压缩格式不允许像这样轻松进行分块访问。如果你有许多小文件,你仍然可以使用Dask GZip数据,但每个文件将被视为一个块。如果这些文件很大,那么您将遇到内存错误。
你可以使用dask.bag,这通常非常适合流式传输结果。你不会得到Pandas的语义,你不会在一个文件中得到任何并行性。
答案 1 :(得分:0)
您可能已经遇到过几个简单的解决方案:
后者可以如下实现
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)