2017-02-10 12 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 Сыроватского как в закомментированного код:

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-файлов, например, с помощью --block-size=size с xz-utils.

Функция compression.get_xz_blocks предоставит вам набор блоков в файле, просто прочитав только заголовок, а не весь файл, и вы можете использовать его в сочетании с задержкой, по существу повторяя некоторую логику в read_text. Мы не поставили время, чтобы сделать это плавным; тот же шаблон можно использовать и для записи заблокированных файлов xz.