哪些压缩类型支持在dask中分块?

问题描述:

当处理一个大单的文件,它可以分解为这样:哪些压缩类型支持在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 DICT像在注释代码:

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格式对你有用。令人困惑的是,该文件可能是块格式的,但标准实现lzmaffi.LZMAFile(或lzma)不使用此阻止。请注意,块格式只适用于zx文件,例如,通过在xz-utils中使用--block-size=size

函数compression.get_xz_blocks将通过仅读取标题而不是整个文件来为您提供文件中的块集合,您可以将其与延迟结合使用,基本上重复read_text中的一些逻辑。我们没有花时间做到这一点,也可以使用相同的模式来写入阻塞的xz文件。