带有很大的python字典列表的内存问题

时间:2018-11-06 07:41:22

标签: python-3.x serialization memory-management deserialization large-data

情况: 我想制作一个大型在线数据集的本地永久副本-字典的python列表-以加快处理速度。列表如下:[{index: 1, name:'A', address:'1', phone:'9999', ...}, {index: 2, name:'B', address:'2', phone:'9998', ...}, ...],并将增长到包含8到10百万个字典。一旦放在本地驱动器上,我希望能够提取列表的特定部分,例如从索引4000到索引72000。下载服务器的局限性在于,每批只能下载(假设)五千本字典。我正在运行一个简单的循环,以批量下载字典列表,并将下载的数据保存到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(假设使用'00 Bytes,使用sys.getsizeof()进行观察)并且索引达到550万左右,则代码将以MemoryError暂停。我能想到的一种解决方案是,只要datacontainer达到5,000,000,就将数据序列化到本地驱动器一次来清空sys.getsizeof()。但是,此序列化应该能够:

  1. 直接附加到现有的序列化文件(无需先将整个数据集反序列化到内存中),并且
  2. 从整个数据库中选择性地反序列化(例如,从索引4000反序列化到72000)

问题

  1. 定期转储数据是处理这种情况的正确方法吗?
  2. 我应该使用哪种方法以如此大的数据集非常快速的方式进行序列化和反序列化。 json无法使用,因为我需要将整个数据集加载到内存中以进行任何事务。另外,专业软件使用哪种方法?

在没有任何可靠的答案后,我尽力寻找答案并伸出援手

----------其他信息-----------

我在以下系统上运行32位Python 3.7:Computer specs

0 个答案:

没有答案