Положение:
Я хочу сделать локальную постоянную копию большого онлайн-набора данных - списка словарей 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. Однако эта сериализация должна быть в состоянии:
- добавить непосредственно к существующему сериализованному файлу (без необходимости сначала десериализовать весь набор данных в память) и
- выборочная десериализация из всей базы данных (например, десериализация с индекса 4000 до 72000)
Вопрос
- Является ли периодический сброс данных правильным подходом для решения этой ситуации?
- Какой метод я должен использовать для сериализации и десериализации таким образом, который очень быстр для таких больших наборов данных. json не может быть использован, потому что для любой транзакции мне потребуется загрузить весь набор данных в память. Кроме того, какой метод используется в профессиональных программах?
Я старался изо всех сил, чтобы найти ответы и обратиться, не сумев получить ничего надежного
---------- Дополнительная информация -----------
Я использую 32-битный Python 3.7 в следующей системе: Характеристики компьютера