减少大字典使用的内存

Roy*_*yHB 6 python python-2.7

我需要创建一个内存对象,其中包含9位整数的键和与每个键相关联的布尔值.我一直在使用dict,如下面的简化示例:

#!/usr/bin/python
from __future__ import print_function
import sys

myDict = {}
for n in range(56000):
        myDict[n] = True

print('Count:',len(myDict),' Size:', sys.getsizeof(myDict))
Run Code Online (Sandbox Code Playgroud)

我需要能够查找并检索与每个键关联的布尔值.问题是字典的大小.在64位Linux系统上使用Python 2.7和上面的例子,根据sys.getsizeof(),dict的大小是3.1兆字节.(每个条目大约56个字节,用于存储9位数加上一个布尔值)

我需要在dict中存储(约)55.000个条目的布尔状态.每个dict键是一个9位整数.我尝试使用整数和str(theInteger)作为键,而不改变dict的大小.

我应该使用其他类型的数据结构或方法来保存具有如此大数据集的内存吗?

小智 8

如果你用一个整数键查找你的布尔值,并且键的范围从0开始并且是连续的,那么实际上没有理由使用列表:

my_list = []
for n in range(56000):
        my_list[n] = True
Run Code Online (Sandbox Code Playgroud)

或更好:

my_list = [True for n in range(5600])
Run Code Online (Sandbox Code Playgroud)

如果这还不够,请尝试array模块并使用每个bool一个字节:

import array
my_array = array.array("b", (True for n in range(56000)))
Run Code Online (Sandbox Code Playgroud)

如果这还不够好,请尝试PyPi上bitarray模块.

另一个想法是使用set:假设你有更多的FalseTrue,只是有一组:

my_true_numbers = {0, 2323, 23452} # just the True ones
Run Code Online (Sandbox Code Playgroud)

并检查

value = number in my_true_numbers
Run Code Online (Sandbox Code Playgroud)

如果你有更多的TrueFalse,做它的其他方式轮.