Python和内存消耗

问题描述:

我正在寻找一种方法来处理使用高内存程序来重载RAM和CPU ......我想处理文件中包含的大量数据。然后我读取这些文件并处理其中的数据。问题是存在许多嵌套for循环,并且根据处理的所有数据创建根XML文件。 该程序在运行时间半小时左右后很容易消耗一些内存。 有什么我可以做的,不要让RAM变得如此之大和/或解决它..?Python和内存消耗

您是否真的需要将XML文件的全部数据一次保存在内存中?

大多数(所有?)XML库在那里允许你do iterative parsing,这意味着你keep in memory just a few nodes of the XML file,not the whole file。这是除非你没有任何库的情况下自己创建一个包含XML文件的字符串,但这有点疯狂。如果是这样,请尽快使用库。

具体的代码示例介绍here可能不适用于你的项目,但考虑几个原则传播通过检测出和lxml文件,当遇到以GB或更多的测量XML数据:

  • 使用迭代解析策略来逐步处理大型文档。
  • 如果需要按随机顺序搜索整个文档,请移至索引的XML数据库。
  • 在您选择的数据中保持非常保守的地位。如果您只对特定节点感兴趣,请使用通过这些名称选择的方法。如果您需要谓词语法,请尝试使用可用的XPath类和方法之一。
  • 考虑手头的任务和开发人员的舒适程度。当速度不是考虑因素时,诸如lxml的对象化或Amara等对象模型对Python开发人员来说可能更自然。仅需要解析时,cElementTree速度更快。
  • 花时间做简单的基准测试。在处理数百万条记录时,小的差异会加起来,而且哪种方法最有效率并不总是很明显。

如果您需要进行数据的复杂的操作,你为什么不只是把它放在一个关系型数据库,并从那里对数据进行操作?这将会有更好的表现。

+0

那么,我并不是一下子读取XML,而是从文本文件中找到数据并从数据中创建一个XML文件......所以XML的生成发生在内存中 – user233864 2010-03-02 03:43:17

+0

@ developerjay:创建过程是一样的,你可以不时地反复写入磁盘,以避免在任何时候都在内存中拥有完整的文件。它会慢一点,但你会用更少的内存。 – voyager 2010-03-02 03:45:41

+0

你会推荐什么库来做到这一点? LXML/cElementTree?我认为,当我需要知道数据需要放置在XML方案中的位置时,迭代地只写一些部分到文件是一项任务。基本上,你怎么能一次写一些数据,仍然保持XML模式......你推荐一个SAX处理程序/生成器,它只需要一个字符串来代替? – user233864 2010-03-02 04:37:37