【问题标题】:Which compression types support chunking in dask?哪些压缩类型支持 dask 中的分块?
【发布时间】:2017-02-10 06:53:16
【问题描述】:

处理一个大的单个文件时,可以这样分解:

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 项目的任何地方使用。

是否有支持这种查找和分块的压缩库?如果有,如何添加?

【问题讨论】:

    标签: dask


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2010-09-20
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多