Сам словарь очень мал - большая часть данных представляет собой все содержимое файлов, хранящихся в списках, содержащих по одному кортежу на строку. Увеличение в 20 раз больше, чем я ожидал, но кажется реальным. Разделение 27-байтовой строки из вашего входного примера в кортеж дает мне 309 байт (рекурсивный подсчет на 64-битной машине). Добавьте к этому некоторые неизвестные накладные расходы на выделение памяти, и 20x не является невозможным.
Альтернативы: для более компактного представления вы хотите преобразовать строки в целые числа / числа с плавающей запятой и плотно их упаковать (без всех этих указателей и отдельных объектов). Я говорю не только об одной строке (хотя это и начало), а о целом списке строк вместе - поэтому каждый файл будет представлен всего четырьмя двумерными массивами чисел. Модуль array
- это начало, но на самом деле вам нужны numpy
массивы:
# Using explicit field types for compactness and access by name
# (e.g. data[i]['mean'] == data[i][2]).
fields = [('x', int), ('y', int), ('mean', float),
('stdv', float), ('npixels', int)]
# The simplest way is to build lists as you do now, and convert them
# to numpy array when done.
data = numpy.array(data, dtype=fields)
mask = numpy.array(mask, dtype=fields)
...
Это дает мне 40 байтов, потраченных на строку (измерено для атрибута .data
; sys.getsizeof
сообщает, что массив имеет постоянную служебную информацию в 80 байтов, но не видит фактические используемые данные). Это все еще на ~ 1,5 больше, чем исходные файлы, но должно легко помещаться в ОЗУ.
Я вижу, что два ваших поля помечены "x" и "y" - если ваши данные плотные, вы можете упорядочить их по ним - data [x, y] == ... - вместо простого хранения (x , у, ...) записи. Помимо того, что он немного более компактен, он был бы наиболее разумной структурой, позволяющей упростить обработку.
Если вам нужно обрабатывать даже больше данных, чем умещается в ОЗУ, pytables
- хорошая библиотека для эффективного доступа к компактным (даже сжатым) табличным данным в файлах. (Это намного лучше, чем обычные базы данных SQL.)