我正在创建和处理一个非常大的数据集,大约有3400万个数据点,我现在将它们存储在内存中的python词典中(大约22,500个词典,每个1588个类实例中有15个词典)。虽然我能够在内存中管理这一切,但我正在耗尽我的所有RAM和大部分交换。
我需要能够首先生成所有这些数据,然后一次对其中的选定部分进行分析。从效率的角度来看,将一些数据写入文件或将其存储在数据库中是否有益?或者我最好只是利用我的交换空间来提高效率。如果我应该写入文件/数据库,是否有建议您使用的python工具?
答案 0 :(得分:1)
因为您将查看“选择部分”,您的应用程序将能够比虚拟内存更好地使用核心。 VM很方便,但是 - 根据定义 - 对于引用的位置有点愚蠢。
使用数据库。
我可能会在简单的基础上从模块sqlite3开始,除非或直到我发现它是一个瓶颈。
答案 1 :(得分:1)
快速获取关系数据库!或者更多RAM。
如果您使用的是Python,请从Python Database Programming开始。 SQLite将是一个选择,但我建议MySQL根据您正在处理的数据量。如果您希望使用面向对象的方法来存储数据,您可能需要查看SQLAlchemy,但如果您最终将每个对象类映射到一个表并且只是应对,那么您可能会获得更高的效率有行和列。
答案 2 :(得分:1)
如果你已经在Python数据结构中有这些数据,假设你没有进行大量的内存索引(比明显的字典键索引更多),你真的不想使用关系数据库 - 你如果没有特别的好处,将会支付相当大的性能损失。
您只需要将已经存在键值对的数据从内存中取出,而不是更改其格式。您应该查看键值存储,例如BDB,Voldemort,MongoDB或Scalaris(仅举几例 - 一些比其他更多参与和功能,但所有应该可以轻松处理数据集),或者对于您认为可能变得更大或更复杂的数据集,您可以查看Cassandra,Riak或CouchDB等系统。所有这些系统都将为关系数据库提供卓越的性能,并更直接映射到内存数据模型。
当然,所有这一切,如果你的数据集通过利用关系数据库的好处(复杂的关系,多个视图等)真的可以更高效,那么就去做吧,但你不应该使用关系数据库,如果你要做的就是让你的数据结构没有内存。
(也可能只是在分段中编组/挑选你的数据并自己管理它会提供比关系数据库更好的性能,假设你的访问模式在一个相对不频繁的事件中进行分页。这是一个很长的镜头,但如果你只是拿着旧的数据,没有人真正看过它,你也可以自己把它扔到磁盘上。)