2015-03-07 1 views
2

У меня есть большой текстовый файл, который в основном состоит из чисел и некоторых разделителей, таких как ,|{}[]: и т. Д. Я использовал кодировку Lempel-Ziv для сжатия. Код, который я использовал, не является моим и является кодом от Rosetta. Я побежал код для линии путем сжатия линии, а также один раз кусок от сжатия порции:Когда сжатие увеличивает размер файла?

def readChunk(file_object, size = 1024): 
    while True: 
     data = file_object.read(size) 
     if not data: 
      break 
     yield data 

def readByChunk(): 
    with open(LARGE_FILE, 'r') as f: 
     for data in readChunk(f, 2048): 
      compressed_chunk = compress(data) 
      compressed_chunk = map(lambda a : str(a), compressed_chunk) 
      comp_file.write(" ".join(compressed_chunk)) 

def readLineByLine(): 
    with open(LARGE_FILE, 'r') as f: 
     lines = f.readlines() 
     for data in lines: 
      compressed_line = compress(data) 
      compressed_line = map(lambda a : str(a), compressed_line) 
      comp_file.write(" ".join(compressed_line)) 

Обе функции вывода файла, который намного больше, чем исходный файл !! Декомпрессия работает отлично, то есть я могу вернуть исходный текст, поэтому считаю, что код верен.

Я делаю что-то неправильно в сохранении файла?

+0

- контент довольно случайный или содержит явные шаблоны? – 101

+0

Нет никаких очевидных шаблонов! Просто много чисел, разделенных символами ',' s и '|' s. –

ответ

1

Общий ответ: «когда данные являются случайными битами» или уже сжаты. 99% других нормальных вещей будут сжиматься просто отлично. Для данных ascii (например, данных, которые вы говорите, вы используете) достаточно тривиальных компрессоров достаточно, только кодировка Хаффмана дает вам приличный импульс, и вы говорите, что используете только десятки уникальных персонажей.

Это означает, что у вас есть куча случайных данных, о которых вы нам не рассказываете, или в компрессоре есть ошибка.

+0

Данные в исходном файле выглядят следующим образом: '3549 = 63; 7792 = 413; 10695 = 90; 10701 = 220; 11900 = 81; 11903 = 175; 14417 = 101; 14738 = 9 ....' каждая строка в файл заканчивается на '\ n'. –

+0

Хорошо, что-то фанки происходит, попробуйте отладить его. Может быть, например, 'str (a)' перекодирует или вы случайно помещаете '' '' между каждым байтом или чем-то просто глупым. Похоже, все должно быть хорошо. – U2EF1

+0

кодирование Хаффмана было бы хорошим для таких данных? –

2

Компрессор, который вы используете, ужасен. Вместо этого попробуйте zlib.compress.

 Смежные вопросы

  • Нет связанных вопросов^_^