2012-05-14 25 views
1

我有两个csv文件存储一个id和一些我需要匹配的相关字段。目前,在Python 2.4中,我使用字典键作为记录ID将csv文件加载到记录对象的字典中。然后我通过一个循环并匹配另一个中的键并做一些处理。在非常大的文件中引用CSV记录

这一切都很好,效果很好,但这是相对较小的csv文件,大约有60,000条记录。我将很快需要处理数百万条记录和可能的多个csv文件。我担心使用当前方法的内存负载。

我最初考虑的是csv阅读器中的一个简单循环,并且根本不打算将它们加载到内存中,但是当为其他文件中的数百万记录中的每一百万记录循环时,效率低下的东西。

那么,有没有这样做的好方法?我卡在Python 2.4,我不能真正改变从CSV文件,我想避免使用SQL,如果可能的话。谢谢

编辑:作为一个球场的数字,我正在查看多达20个200MB文件。

+0

最好的方法可以很好地依赖于文件的数量和每个文件的大小。你能把一些球场号码给这些参数吗? – NPE

+0

这会很方便添加,对不起。我会说每个文件最多200MB,最多20个文件。这有点偏高,但我宁愿安全,也不要抱歉。我会更新主帖。 – Captastic

+1

我不确定这是否有助于数据的大小,但我会创建一个CSV导入实用程序,然后将数据存储在SQLite数据库文件中。您甚至可以拥有一个列出文件导入路径和数据以备将来参考的表格。索引编制可能比试图将整个内容保存在内存中或重写csv文件更有效。 –

回答

2

你想避免SQL的原因是什么?

真的想切换到使用某种数据库。我建议SQLite开始;它作为sqlite3 module.发布到Python中。它没有其他依赖性,使用普通文件(或RAM)进行数据存储 - 不需要网络/服务器设置 - 而且它很容易开始使用。

要切换到数据库的原因包括:

  • 更少的代码编写。不必编写循环来查找特定元素,只需编写SELECT查询即可。
  • 数据库知道如何以甚至没有想过的方式优化查询。它通常比Python中的任何伪数据库快得多,速度更快。
  • 你可以做更复杂的查询。您可以选择符合特定条件的行(SELECT * FROM table WHERE...),将一个表中的记录与另一个表(SELECT * FROM table1 JOIN table2...)中的记录相关联,等等。
+0

啊对,谢谢。我不知道有没有办法做一个SQL数据库没有虚假的网络和服务器。这可能是我的最佳途径。你知道一个Python 2.4中的模块吗? sqllite3是2.5的一部分,我很害怕2.4。 – Captastic

+0

@Captastic:见http://stackoverflow.com/questions/789030/how-can-i-import-the-sqlite3-module-into-python-2-4 –

+0

现货,谢谢 – Captastic

相关问题