Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在dict python中使用更少的内存存储数据_Python - Fatal编程技术网

如何在dict python中使用更少的内存存储数据

如何在dict python中使用更少的内存存储数据,python,Python,我有一些大约1.5GB的数据。现在我想用python将这些信息存储到一个大dict中。然而,它的成本远高于1.5GB,可能是10倍。这台机器没有那么多内存。有没有办法使用更少的内存将这些数据放入dict结构?键和值都是整数 最好使用快速数据库,将键值对存储到磁盘,并允许智能检索和索引,例如。您应该尝试使用数据库,以便不必将所有数据存储在内存中 伯克利数据库非常适合您使用,因为它只存储键值对。它是数据库形式的“dict” 代码将类似于: from bsddb3 import db dbdict =

我有一些大约1.5GB的数据。现在我想用python将这些信息存储到一个大dict中。然而,它的成本远高于1.5GB,可能是10倍。这台机器没有那么多内存。有没有办法使用更少的内存将这些数据放入dict结构?键和值都是整数


最好使用快速数据库,将键值对存储到磁盘,并允许智能检索和索引,例如。

您应该尝试使用数据库,以便不必将所有数据存储在内存中

伯克利数据库非常适合您使用,因为它只存储键值对。它是数据库形式的“dict”

代码将类似于:

from bsddb3 import db
dbdict = DB()
dbdict.open("your database", None, db.DB_HASH, db.DB_CREATE)
dbdict[3]=2 #works just like a dict!

以下是绑定:

如果键是整数,则根据键的范围,可以使用数组而不是字典。你的键成为数组中的索引,仅此而已。这将比创建字典更节省内存


如果您没有足够的RAM将所有数据放入一个数组中,那么可以使用sqlite或Berkeley DB之类的工具来有效地将字典存档。当然,它会慢得多。

使用pickle对象在字典中存储数据。请参阅此链接以使用pickle

因为索引和数据都是整数,所以您可以将数据保存在文件中,并像访问数组一样进行访问,但只有您正在处理的页面将位于RAM中,其他页面将保留在磁盘上

mmap是基于字节的,这意味着中的索引在您的体系结构上类似于index*sizeof(int),您需要读取sizeof(int)字节,而不仅仅是一个字节,并使用struct模块(http://docs.python.org/2/library/struct.html)将其转换为python整数


如果所有数据都在RAM中,则此解决方案比使用数组慢一点,如果您的系统开始分页,则此解决方案将比使用普通数组快。

从文件加载字典后,您将如何处理它?可能尝试一些键值数据库,如LevelDb请注意,海报上有键和值,表示映射而不是数组。当然,只使用
mmap
模块就可以实现哈希表,但是使用现有的磁盘数据库(如sqlite或Berkley DB)要好得多(更快)。是的,但键和值似乎都是“int”,考虑到整个模块的大小,我想键并不是那么稀疏。所以它几乎是一个数组,比使用数据库快得多。因为数据库是用来处理很多这里不需要的东西的。密钥是整数,可以很容易地引用未知稀疏性的64位整数。海报上提到了“big dict”,因此很明显,我们需要类似dict(而不是类似数组)的界面。如果不知道预期的使用模式,很难预测数据库或基于mmap/struct的手动解决方案是否会更快。是的,我同意。我把这个解决方案作为一个可能的选择,而不是作为生命宇宙和一切的答案。