2017-02-10 5 views
1

Wenn eine große einzelne Datei verarbeiten, kann es als so aufgebrochen werden:Welche Komprimierungstypen unterstützen das Chunking in DASK?

import dask.bag as db 

my_file = db.read_text('filename', blocksize=int(1e7)) 

Dies funktioniert gut, aber die Dateien arbeite ich mit ein hohes Maß an Redundanz und so halten wir sie komprimiert. Das Übergeben komprimierter gzip-Dateien führt zu einem Fehler, dass die Suche in gzip nicht unterstützt wird und daher nicht in Blöcken gelesen werden kann.

Die Dokumentation hier http://dask.pydata.org/en/latest/bytes.html#compression schlägt vor, dass einige Formate Random Access unterstützen.

Der entsprechende interne Code Ich denke, hier ist:

https://github.com/dask/dask/blob/master/dask/bytes/compression.py#L47

Es sieht aus wie lzma könnte es unterstützen, aber es hat sich als Kommentar gekennzeichnet.

Hinzufügen lzma in die seekable_files DIKT wie in der kommentierten out-Code:

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') 

führt den folgenden Fehler:

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 

Ich gehe davon aus, dass die Funktionen am Ende der Datei (get_xz_blocks) zB kann dafür verwendet werden, scheint aber nirgendwo im desk-projekt verwendet zu werden.

Gibt es Komprimierungsbibliotheken, die dieses Suchen und Chunking unterstützen? Wenn ja, wie können sie hinzugefügt werden?

Antwort

2

Ja, Sie haben Recht, dass das XZ-Format Ihnen nützlich sein kann. Die Verwirrung ist, dass die Datei blockformatiert sein kann, aber die Standardimplementierung lzmaffi.LZMAFile (oder lzma) nutzt diese Blockierung nicht. Beachten Sie, dass die Blockformatierung für zx-Dateien nur optional ist, z. B. indem Sie --block-size=size mit xz-utils verwenden.

Die Funktion compression.get_xz_blocks gibt Ihnen die Menge der Blöcke in einer Datei, indem nur die Kopfzeile und nicht die ganze Datei gelesen wird, und Sie können dies in Kombination mit der verzögerten Wiederholung der Logik in read_text verwenden. Wir haben nicht die Zeit investiert, um das nahtlos zu machen. Das gleiche Muster könnte auch verwendet werden, um blockierte XZ-Dateien zu schreiben.

Verwandte Themen