使用 Dask 读取单个大型压缩 csv(内存太大)
Read single large zipped csv (too large for memory) using Dask
我有一个用例,我有一个 S3 存储桶,其中包含数百个 gzip 文件的列表。每个单独的文件在解压缩并加载到数据帧中时,占用的内存都超过可用内存。我想阅读这些文件并执行一些功能。但是,我似乎无法弄清楚如何解决这个问题。我试过 Dask 的 read_table,但由于 compression='gzip' 似乎需要 blocksize=None,这似乎不起作用。有什么我想念的吗?或者有更好的方法吗?
以下是我尝试调用 read_table 的方式(请注意名称、类型和空值在别处定义):
df = dd.read_table(uri,
compression='gzip',
blocksize=None,
names=names,
dtype=types,
na_values=nulls,
encoding='utf-8',
quoting=csv.QUOTE_NONE,
error_bad_lines=False)
我愿意接受任何建议,包括改变整个方法。
这不能直接完成,因为了解您在 gzip 文件流中的位置的唯一方法是从头开始阅读。这意味着数据的每个分区都需要从头开始读取整个文件,因此 Dask 决定显式错误。
理论上,我可能会扫描一次您的文件,然后找出所有 gzip 块的起始位置。但是,据我所知,没有代码可以做到这一点。
我有一个用例,我有一个 S3 存储桶,其中包含数百个 gzip 文件的列表。每个单独的文件在解压缩并加载到数据帧中时,占用的内存都超过可用内存。我想阅读这些文件并执行一些功能。但是,我似乎无法弄清楚如何解决这个问题。我试过 Dask 的 read_table,但由于 compression='gzip' 似乎需要 blocksize=None,这似乎不起作用。有什么我想念的吗?或者有更好的方法吗?
以下是我尝试调用 read_table 的方式(请注意名称、类型和空值在别处定义):
df = dd.read_table(uri,
compression='gzip',
blocksize=None,
names=names,
dtype=types,
na_values=nulls,
encoding='utf-8',
quoting=csv.QUOTE_NONE,
error_bad_lines=False)
我愿意接受任何建议,包括改变整个方法。
这不能直接完成,因为了解您在 gzip 文件流中的位置的唯一方法是从头开始阅读。这意味着数据的每个分区都需要从头开始读取整个文件,因此 Dask 决定显式错误。
理论上,我可能会扫描一次您的文件,然后找出所有 gzip 块的起始位置。但是,据我所知,没有代码可以做到这一点。