Ошибка памяти с очень большим списком словарей Python - PullRequest
0 голосов
/ 06 ноября 2018

Положение: Я хочу сделать локальную постоянную копию большого онлайн-набора данных - списка словарей Python - для более быстрой обработки. Список примерно такой: [{index: 1, name:'A', address:'1', phone:'9999', ...}, {index: 2, name:'B', address:'2', phone:'9998', ...}, ...] и будет содержать 8-10 миллионов словарей. Попав на локальный диск, я хочу иметь возможность извлекать определенную часть списка, например, из индекса 4000 в индекс 72000. Ограничение от сервера загрузки состоит в том, что в каждом пакете можно загружать только (скажем, 5 тысяч словарей). Я запускаю простой цикл для загрузки списка словарей в пакетном режиме и удержания загруженных данных в datacontainer:

import sys

def downloaddata(start_index, end_index):
    datacontainer = []         
    counter = start_index
    while counter <= end_index:
        datacontainer.extend(RESTAPIDOWNLOADER(counter, min(counter + 4999, end_index)))
        counter += 5000
        print(sys.getsizeof(datacontainer))

downloaddata(1, 8000000)

Усложнение: Как только размер datacontainer достигнет 22 733 208 (наблюдаемый с использованием sys.getsizeof(), принимая в качестве '00 байт?) С индексом, достигающим около 5,5 миллионов, код останавливается с MemoryError. Одно из решений, которое я могу придумать, - очистить datacontainer путем сериализации данных на локальный диск один раз, когда sys.getsizeof() достигает 5 000 000. Однако эта сериализация должна быть в состоянии:

  1. добавить непосредственно к существующему сериализованному файлу (без необходимости сначала десериализовать весь набор данных в память) и
  2. выборочная десериализация из всей базы данных (например, десериализация с индекса 4000 до 72000)

Вопрос

  1. Является ли периодический сброс данных правильным подходом для решения этой ситуации?
  2. Какой метод я должен использовать для сериализации и десериализации таким образом, который очень быстр для таких больших наборов данных. json не может быть использован, потому что для любой транзакции мне потребуется загрузить весь набор данных в память. Кроме того, какой метод используется в профессиональных программах?

Я старался изо всех сил, чтобы найти ответы и обратиться, не сумев получить ничего надежного

---------- Дополнительная информация -----------

Я использую 32-битный Python 3.7 в следующей системе: Характеристики компьютера

...