2017-02-06 9 views
9

Как я уже изучил, файлы журнала, созданные Mongodb, сжимаются с использованием алгоритма мгновенного сжатия. но я не могу распаковать этот сжатый файл журнала. Это дает ошибку при попытке распаковатьКак распаковывать файлы журнала mongo

поток ошибок отсутствует мгновенным идентификатор

код Python Я использовал распаковывать следующим образом:

import collections 
import bson 
from bson.codec_options import CodecOptions 
import snappy 
from cStringIO import StringIO 
try: 
    with open('journal/WiredTigerLog.0000000011') as f: 
     content = f.readlines() 
     fh = StringIO() 
     snappy.stream_decompress(StringIO("".join(content)),fh) 
     print fh 
except Exception,e: 
    print str(e) 
    pass 

пожалуйста, помогите я не могу сделайте мой путь после этого

+1

Возможно, ваш журнал не сжимается. Попробуйте открыть его в шестнадцатеричном редакторе и посмотреть, можете ли вы читать ваши простые данные. –

+0

То же, что @RetoAebersold сказал. [Кажется, не найти ожидаемый заголовок Snappy] (https://github.com/andrix/python-snappy/blob/master/snappy.py#L213). – Dan

+0

Пробовал фрагмент кода, и он работал над мгновенными данными с кадрами. Добавляя к тому, что другие отметили, если вы открываете файл в шестнадцатеричном редакторе, должно быть ясно, являются ли это мгновенными обрамленными данными. Подпись (начиная со сдвига файла 0): '\ 377 \ 006 \ 0 \ 0sNaPpY' как из * файла магии nix или' ff06 0000 734e 6150 7059' в шестнадцатеричном формате. Возможно, WiredTiger Storage Engine пишет, используя параметр [другое сжатие] (https://docs.mongodb.com/manual/core/wiredtiger/#compression)? –

ответ

1

Существует две формы сжатия Snappy, основная форма и потоковая форма. Основная форма имеет ограничение на то, что все это должно соответствовать в памяти, поэтому существует потоковая форма, позволяющая сжимать большие суммы данных . Формат потоковой передачи имеет заголовок, а затем поддиапазоны , которые сжимаются. Если заголовок отсутствует, это похоже на то, что, возможно, вы сжали, используя основную форму, и пытаетесь разжать с потоковой формой. https://github.com/andrix/python-snappy/issues/40

Если это так, используйте decompress вместо stream_decompress.

Но если может быть, что данные не будут прессовать:

with open('journal/WiredTigerLog.0000000011') as f: 
    for line in f: 
     print line 

может работать.

Минимальный размер записи журнала для WiredTiger составляет 128 байт. Если запись журнала составляет 128 байт или меньше, WiredTiger не сжимает эту запись. https://docs.mongodb.com/manual/core/journaling/

+0

Поскольку WiredTiger только сжимает записи размером более 128 байт. Как мы обнаружим, какие линии сжаты, а какие нет? – Cybersupernova