Сжатие файлов данных измерений - PullRequest
1 голос
/ 04 августа 2011

из измерений я получаю текстовые файлы, которые в основном содержат таблицу чисел с плавающей точкой, с размерами 1000x1000.Те занимают около 15 МБ пространства, которое, учитывая, что я получаю около 1000 файлов результатов в серии, сохранить недопустимо.Поэтому я стараюсь максимально сжать их без потери данных.Моя идея состоит в том, чтобы сгруппировать числа в ~ 1000 шагов в ожидаемом диапазоне и сохранить их.Это обеспечит достаточное разрешение.Тем не менее, мне еще нужно учесть 1.000.000 баллов, и поэтому мой результирующий файл по-прежнему занимает около 4 МБ.Я, вероятно, не смогу сжать это дальше?Большая проблема - время расчета, которое это берет.Сейчас я предполагаю, 10-12 секунд на файл, так что около 1000 часов для 1000 файлов.Ваае много.Это алгоритм, который я обдумал, у вас есть предложения?Вероятно, есть гораздо более эффективные алгоритмы для этого, но я не очень программист ...

import numpy

data=numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)
out=numpy.empty((1000,1000),numpy.int16)
i=0
min=-0.5
max=0.5
step=(max-min)/1000
while i<=999:
    j=0
    while j<=999: 
        k=(data[i,j]//step)
        out[i,j]=k
        if data[i,j]>max:
            out[i,j]=500
        if data[i,j]<min:
            out[i,j]=-500
        j=j+1
    i=i+1
numpy.savetxt('converted.txt', out, fmt="%i")

Заранее спасибо за любые подсказки, которые вы можете предоставить!Jakob

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Я вижу, вы храните массивы в виде текстовых файлов. Есть более быстрый и более компактный способ: просто сбросьте его.

Если ваши числа с плавающей запятой можно хранить как 32-разрядные числа с плавающей запятой, используйте это:

data = numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)

data.astype(numpy.float32).dump(open('converted.numpy', 'wb'))

тогда вы можете прочитать это с

data = numpy.load(open('converted.numpy', 'rb'))

Файлы будут 1000x1000x4 байт, около 4 МБ.

Последняя версия numpy поддерживает 16-битные числа с плавающей точкой. Может быть, ваши поплавки будут в пределах своего ограничительного диапазона.

2 голосов
/ 04 августа 2011

numpy.savez_compressed позволит вам сохранить множество массивов в одном сжатом двоичном файле.

Однако вы не сможете сжать его , что много - если у вас есть 15 ГБ данных, вы волшебным образом не собираетесь вписывать его в 200 МБ алгоритмами сжатия. Вы должны выбросить некоторые из ваших данных, и только вы можете решить, сколько вам нужно сохранить.

1 голос
/ 04 августа 2011

Используйте модуль zipfile , bz2 или gzip для сохранения в файл zip, bz2 или gz из python. Любая схема сжатия, которую вы пишете самостоятельно в разумные сроки, почти наверняка будет медленнее и будет иметь более низкую степень сжатия, чем эти общие, но оптимизированные и скомпилированные решения. Также подумайте о том, чтобы воспользоваться советом Эумиро.

...