哪种压缩类型支持dask中的分块?

时间:2017-02-10 06:53:16

标签: 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项目中的任何地方都没有使用。

是否有支持此搜索和分块的压缩库?如果是这样,他们如何添加?

1 个答案:

答案 0 :(得分:2)

是的,你说xz格式对你有用是正确的。令人困惑的是,文件可能是块格式的,但标准实现lzmaffi.LZMAFile(或lzma)没有使用此阻塞。请注意,块格式化仅对zx文件是可选的,例如,通过将--block-size=size与xz-utils一起使用。

函数compression.get_xz_blocks将通过只读取头文件而不是整个文件来为您提供文件中的块集合,并且可以将它与延迟组合使用,基本上重复{中的一些逻辑{1}}。我们没有花时间使这个无缝;同样的模式也可用于写入被阻止的xz文件。