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

时间:2012-11-22 14:05:14

标签: python

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

最诚挚的问候,

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您应该尝试使用数据库,这样就不必将所有数据存储在内存中。

Berkeley数据库非常适合您的使用,因为它只存储键值对。它是数据库形式的“字典”!

代码看起来像:

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!

以下是绑定:Python "bindings" for Oracle Berkeley DB

答案 2 :(得分:0)

如果键是整数,那么,根据键的范围,您可以使用数组http://docs.python.org/2/library/array.html而不是字典。你的密钥成为数组中的索引,就是这样。这比创建字典的内存效率更高。

如果没有足够的RAM来将所有数据都放入数组中,那么可以使用像sqlite或Berkeley DB这样的东西,实际上有一个字典存档。当然,它会慢得多。

答案 3 :(得分:0)

使用pickle对象将数据存储在字典中。请参阅此链接以使用pickle http://wiki.python.org/moin/UsingPickle

答案 4 :(得分:0)

由于您的索引和数据是整数,您可以将数据保存在文件中并像访问数组那样访问它,但只有您正在处理的页面将在RAM中,其他页面将保留在磁盘上

请参阅http://docs.python.org/2/library/mmap.html

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

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