2

我有一个需要加载到内存中的人员记录数据库,因为它们会以各种顺序被多次访问。到目前为止,我只是为每条记录实例化了一个 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 上运行。通过 Thrift (http://thrift.apache.org/) 连接到 Python。

更新 2:我需要以许多不同的顺序访问数据库中的所有记录,这些顺序是在运行时确定的。我想,在每次迭代中,我可以对数据库进行 8,000,000 次查询,但我认为这可能会很慢。

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

4

4 回答 4

3

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

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

于 2012-08-27T19:12:38.320 回答
2

听起来 numpy结构化数组在这里可以很好地工作。与使用 python 对象相比,它使用的内存要少得多,并且 numpy 对它们提供了许多快速方便的操作。此外,数组可以是内存映射文件,有时很有用。

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

于 2012-08-28T11:03:18.580 回答
0

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

于 2012-08-27T20:18:58.903 回答
0

根据所需的性能和用例,可能有很多方法可以处理此问题,但您可能并不需要将所有数据都保存在内存中。一种明显的方法是使用真正的数据库引擎,例如sqliteor mysql。一种更易于实现但可能慢得多的方法是shelve.

于 2012-08-27T19:15:24.503 回答