2

我正在创建和处理一个非常大的数据集,其中包含大约 3400 万个数据点,并且我目前将它们存储在内存中的 python 字典中(大约 22,500 个字典,每个 1588 个类实例中有 15 个字典)。虽然我能够在内存中管理这一切,但我正在用完我的所有 RAM 和大部分交换空间。

我需要能够首先生成所有这些数据,然后一次对其中的选定部分进行分析。从效率的角度来看,将其中一些数据写入文件或将其存储在数据库中是否有益?或者我是否最好只是降低使用我的交换空间带来的效率。如果我应该写入文件/数据库,是否有任何 Python 工具可以推荐这样做?

4

3 回答 3

1

因为您将查看“选择部分”,所以您的应用程序将能够比虚拟内存更好地利用核心。VM 很方便,但是 - 根据定义 - 关于参考位置有点愚蠢。

使用数据库。

在简单的基础上,我可能会从模块sqlite3开始,除非或直到我发现它是一个瓶颈。

于 2010-06-21T19:24:38.110 回答
1

快速获取关系数据库!或者更多的RAM。

如果您使用的是 Python,请从Python 数据库编程开始。 SQLite将是一个选择,但我会根据您正在处理的数据量建议MySQL 。如果您想要一种面向对象的方法来存储数据,您可能需要查看SQLAlchemy,但如果您最终自己将每个对象类映射到表并只处理行和列,您可能会获得更高的效率.

于 2010-06-21T19:42:24.460 回答
1

如果你已经在 Python 数据结构中有这些数据,假设你没有做很多内存索引(比明显的字典键索引更多),你真的不想使用关系数据库 - 你会付钱的相当大的性能损失,没有特别的好处。

您只需要从内存中取出已经存在的键值对数据,而不是更改其格式。您应该查看键值存储,例如BDBVoldemortMongoDBScalaris(仅举几例 - 一些比其他更复杂、更实用,但都应该轻松处理您的数据集),或者您认为可能会增长的数据集甚至更大或更复杂,您可以查看CassandraRiakCouchDB(以及其他)等系统。所有这些系统都将为您提供比关系数据库更出色的性能,并更直接地映射到内存数据模型。

话虽如此,当然,如果您的数据集真的可以通过利用关系数据库的优势(复杂关系、多个视图等)来提高性能,那么就去做吧,但如果出现以下情况,您不应该使用关系数据库您要做的就是让您的数据结构超出内存。

(假设您的访问模式使得分页进/出一个相对不常见的事件,那么仅在分段中编组/腌制您的数据并自行管理它可能会提供比关系数据库更好的性能。这是一个长期的目标,但如果你是只是保存旧数据而没有人真正查看它,您不妨自己将其扔到磁盘上。)

于 2010-06-21T21:04:39.210 回答