哪些压缩类型支持 dask 分块?
Which compression types support chunking in dask?
处理单个大文件时,可以这样拆分:
import dask.bag as db
my_file = db.read_text('filename', blocksize=int(1e7))
效果很好,但我正在处理的文件具有高度冗余,因此我们将它们压缩。传入压缩的 gzip 文件会产生一个错误,即不支持在 gzip 中搜索,因此无法分块读取。
此处的文档 http://dask.pydata.org/en/latest/bytes.html#compression 建议某些格式支持随机访问。
我认为相关的内部代码在这里:
https://github.com/dask/dask/blob/master/dask/bytes/compression.py#L47
看起来 lzma 可能支持它,但它被注释掉了。
将 lzma 添加到 seekable_files 字典中,就像在注释掉的代码中一样:
from dask.bytes.compression import seekable_files
import lzmaffi
seekable_files['xz'] = lzmaffi.LZMAFile
data = db.read_text('myfile.jsonl.lzma', blocksize=int(1e7), compression='xz')
抛出以下错误:
Traceback (most recent call last):
File "example.py", line 8, in <module>
data = bag.read_text('myfile.jsonl.lzma', blocksize=int(1e7), compression='xz')
File "condadir/lib/python3.5/site-packages/dask/bag/text.py", line 80, in read_text
**(storage_options or {}))
File "condadir/lib/python3.5/site-packages/dask/bytes/core.py", line 162, in read_bytes
size = fs.logical_size(path, compression)
File "condadir/lib/python3.5/site-packages/dask/bytes/core.py", line 500, in logical_size
g.seek(0, 2)
io.UnsupportedOperation: seek
我假设文件底部的函数 (get_xz_blocks
) 例如可以用于此,但似乎没有在 dask 项目的任何地方使用。
是否有支持这种查找和分块的压缩库?如果可以,如何添加?
是的,您说得对,xz 格式对您很有用。令人困惑的是,该文件可能是 block-formatted,但标准实现 lzmaffi.LZMAFile
(或 lzma)不使用此阻塞。请注意,block-formatting 仅对 zx 文件是可选的,例如,通过使用 --block-size=size
和 xz-utils。
函数 compression.get_xz_blocks
将通过仅读取文件头而不是整个文件来为您提供文件中的块集,您可以将其与延迟结合使用,本质上是重复一些逻辑在 read_text
。我们还没有花时间让它变得无缝;相同的模式也可用于写入阻塞的 xz 文件。
处理单个大文件时,可以这样拆分:
import dask.bag as db
my_file = db.read_text('filename', blocksize=int(1e7))
效果很好,但我正在处理的文件具有高度冗余,因此我们将它们压缩。传入压缩的 gzip 文件会产生一个错误,即不支持在 gzip 中搜索,因此无法分块读取。
此处的文档 http://dask.pydata.org/en/latest/bytes.html#compression 建议某些格式支持随机访问。
我认为相关的内部代码在这里:
https://github.com/dask/dask/blob/master/dask/bytes/compression.py#L47
看起来 lzma 可能支持它,但它被注释掉了。
将 lzma 添加到 seekable_files 字典中,就像在注释掉的代码中一样:
from dask.bytes.compression import seekable_files
import lzmaffi
seekable_files['xz'] = lzmaffi.LZMAFile
data = db.read_text('myfile.jsonl.lzma', blocksize=int(1e7), compression='xz')
抛出以下错误:
Traceback (most recent call last):
File "example.py", line 8, in <module>
data = bag.read_text('myfile.jsonl.lzma', blocksize=int(1e7), compression='xz')
File "condadir/lib/python3.5/site-packages/dask/bag/text.py", line 80, in read_text
**(storage_options or {}))
File "condadir/lib/python3.5/site-packages/dask/bytes/core.py", line 162, in read_bytes
size = fs.logical_size(path, compression)
File "condadir/lib/python3.5/site-packages/dask/bytes/core.py", line 500, in logical_size
g.seek(0, 2)
io.UnsupportedOperation: seek
我假设文件底部的函数 (get_xz_blocks
) 例如可以用于此,但似乎没有在 dask 项目的任何地方使用。
是否有支持这种查找和分块的压缩库?如果可以,如何添加?
是的,您说得对,xz 格式对您很有用。令人困惑的是,该文件可能是 block-formatted,但标准实现 lzmaffi.LZMAFile
(或 lzma)不使用此阻塞。请注意,block-formatting 仅对 zx 文件是可选的,例如,通过使用 --block-size=size
和 xz-utils。
函数 compression.get_xz_blocks
将通过仅读取文件头而不是整个文件来为您提供文件中的块集,您可以将其与延迟结合使用,本质上是重复一些逻辑在 read_text
。我们还没有花时间让它变得无缝;相同的模式也可用于写入阻塞的 xz 文件。