高效的内存存储8,000,000条记录(Python)

时间:2012-08-27 19:09:59

标签: python hbase thrift in-memory-database

我有一个人员记录数据库,我需要加载到内存中,因为它们将以各种顺序被访问多次。到目前为止,我只是为每条记录实例化了一个Python对象。但是现在我有8,000,000条记录可供使用,我没有足够的记忆来实现这种简单的方法。

在平面文件中,每个记录最多只占用500个字节,没有压缩(压缩时更少)。因此整个数据集在磁盘上小于4 GB。然而,一旦每个记录由Python作为对象加载,我估计将使用40 GB的RAM。我的机器只有12 GB的RAM。

我正在考虑将C与我的Python程序集成,并将每个记录存储为C中的结构。这听起来像是一个很好的解决方案吗?或者是否有更好的方法在Python中紧凑地存储记录,不需要与C接口?

更新:我正在使用的数据库是Hbase(http://hbase.apache.org/),在Hadoop上运行。与Python的连接通过Thrift(http://thrift.apache.org/)发生。

更新2:我需要以多种不同的顺序访问数据库中的所有记录,这些订单是在运行时确定的。我想,在每次迭代中,我都可以向数据库发出8,000,000条查询,但我认为这可能会非常慢。

更新3:我认为没有一种很好的存储行的方法,因此可以按顺序访问它们。我在下一次迭代中需要记录的顺序(我的程序是迭代机器学习算法),是在前一次迭代过程中通过线性代数投影到数据矩阵的特定特征向量上确定的。

4 个答案:

答案 0 :(得分:3)

这是数据库的完美用例。您可以将其存储在磁盘上并根据需要进行查询,而不是将所有内容存储在内存中。

sqllite3是一个不错的选择。您可能对诸如SQLAlchemy之类的对象关系映射器(ORM)特别感兴趣,这使得数据库的使用类似于使用Python对象。

答案 1 :(得分:2)

听起来numpy structured arrays在这里可以很好地运作。它将使用比使用python对象少得多的内存,而numpy提供了许多快速和快速的对象。方便的操作。此外,数组可以是内存映射文件,有时可能很有用。

数据库是否是一个不错的选择(正如其他人建议的那样)取决于您的算法以及数据大小。在很多情况下,numpy是一种更好的解决方案(工作量少,效率更高等)。

答案 2 :(得分:0)

根据所需的性能和用例,可能有很多方法可以解决这个问题,但您可能并不需要将所有数据都存储在内存中。一个显而易见的方法是使用真实的数据库引擎,如sqlitemysqlshelve是一种更简单的实施方式,但速度可能更慢。

答案 3 :(得分:0)

我同意该线程中的其他人认为数据库将是首选工具,但如果你坚持在内存中查看http://www.memsql.com/(虽然我从未使用过它)