2014-07-22 73 views
1

我正在研究一个项目,在该项目中,我将大量数据抓取并重新组织到结果文本文件中。之前我使用字典来存储临时数据,但随着数据量的增加,由于内存使用和字典变得无用,进程变慢。Python文本文件而不是字典

由于在我的情况下进程速度并不那么重要,我试图将字典替换为文件,但我不确定如何轻松地将文件指针移动到适当的位置并读取所需的数据。在字典中,我可以很容易地引用任何数据。我想达到相同,但在文件中。

我想使用mmap并编写自己的函数来移动文件指针,我想要的地方。 Python是否具有用于此类操作的内置或第三方模块?

欢迎任何其他理论方法。

回答

8

我想你现在正在尝试重新创建一个键值数据库。

也许最简单的事情是检查sqlite3模块是否会为您提供您所需要的。使用现成的数据库比滚动自己的数据库更容易!

当然,sqlite3不是键值DB(表面上),所以如果你需要的东西更简单,看看LMDB及其Python绑定:http://lmdb.readthedocs.org/en/release/

这是因为重量轻,速度快随着它的到来。这可能是实现你想要的最快方法。


应该指出的是,没有最佳的键值数据库。有几个方面需要考虑。至少:

  • 你读了很多或写了很多吗?
  • 什么是关键和值的大小?
  • 你需要交易/防撞吗?
  • 你有重复的键(一个键,几个值)?
  • 你想排序的密钥?
  • 您是否想按照插入的顺序读取数据?
  • 什么是您的数据库大小(MB,GB,TB,PB)?
  • 您是否受限于IO或CPU?

例如,我上面提到的LMDB在读取密集型任务中非常好,而不是在写密集型任务中。它提供事务处理,按键排列顺序并防止崩溃(受底层文件系统限制)。但是,如果您需要经常编写数据库,LMDB可能不是最佳选择。

另一方面,SQLite并不是完成这项任务的理想选择 - 理论上是speking。实际上,它被嵌入到标准的Python发行版中,因此易于使用。它可以提供足够的性能,因此可能是最好的选择。

那里有许多高质量的数据库。通过不提及它们,我不会试图给出这样的印象:在这个答案中提到的数据库是唯一不错的选择。大多数数据库管理员都有一个非常好的理由。虽然有些已经过时,但大多数在应用领域都有自己的甜点。

该领域不断变化。有两个全新的数据库可用,旧的数据库系统被更新。阅读旧基准时应该牢记这一点。此外,所使用的硬件类型也有其影响;具有SSD磁盘的计算机,云计算实例和具有HDD的传统计算机在性能方面的表现完全不同。

+0

感谢您的及时回应!我会尝试两个。 – g0m3z

+0

根据DrV的想法,我搜索了'python的键值数据库',结果发现在这个主题中还有另一个发展良好的线程:[link](http://stackoverflow.com/questions/1690605/reliable -and-efficient-key-value-database-for-linux) – g0m3z

+0

@ g0m3z:在这个线程中有很多很好的讨论。但是,到那时,所有现代系统都不存在了。另外,我认为你不应该开始评估分布式或其他非常复杂的系统,因为你的任务很简单。从单个文件开始。就我个人而言,我会尝试SQLite,如果它不是太慢,就使用它,并忘记理论上的考虑。 – DrV