2017-02-10 68 views
1

當處理一個大單的文件,它可以分解爲這樣:哪些壓縮類型支持在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項目的任何地方使用。

是否有壓縮庫確實支持這種查找和分塊?如果是這樣,他們怎麼能被添加?

回答

2

是的,你說得對,xz格式對你有用。令人困惑的是,該文件可能是塊格式的,但標準實現lzmaffi.LZMAFile(或lzma)不使用此阻止。請注意,塊格式只適用於zx文件,例如,通過在xz-utils中使用--block-size=size

函數compression.get_xz_blocks將通過僅讀取標題而不是整個文件來爲您提供文件中的塊集合,您可以將其與延遲結合使用,基本上重複read_text中的一些邏輯。我們沒有花時間做到這一點,也可以使用相同的模式來寫入阻塞的xz文件。

相關問題