Python 文本文件而不是字典

标签 python file-io dictionary

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

由于处理速度对我来说不是那么重要,我正在尝试将字典替换为文件,但我不确定如何轻松地将文件指针移动到适当的位置并读取所需的数据。在字典中我可以轻松地引用任何数据。我想实现相同但在文件中。

我正在考虑使用 mmap 并编写自己的函数来将文件指针移动到我想要的位置。 Python 是否有用于此类操作的内置或第 3 方模块?

欢迎任何其他理论方法。

最佳答案

我认为您现在正在尝试重新发明一个键值数据库。

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

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

它既轻便又快速。它可能接近实现您想要的目标的最快方式。


需要注意的是,没有最优的键值数据库。有几个方面需要考虑。至少:

  • 你读的多还是写的多?
  • 键和值的大小是多少?
  • 您需要交易/防崩溃吗?
  • 您是否有重复键(一个键,多个值)?
  • 你想要排序键吗?
  • 是否要按照插入数据的顺序读出数据?
  • 您的数据库大小是多少(MB、GB、TB、PB)?
  • 您是否受 IO 或 CPU 限制?

例如,我上面建议的 LMDB 在读密集型任务中非常好,在写密集型任务中表现不佳。它提供交易,按排序顺序保存 key 并且是防崩溃的(受底层文件系统限制)。但是,如果您需要经常编写数据库,LMDB 可能不是最佳选择。

另一方面,从理论上讲,SQLite 并不是这项任务的完美选择。实际上,它内置于标准 Python 发行版中,因此易于使用。它可能提供足够的性能,因此可能是最佳选择。

那里有许多高质量的数据库。通过不提及它们,我不想给人留下这样的印象,即这个答案中提到的数据库是唯一好的选择。大多数数据库管理器都有其存在的充分理由。虽然有一些有点过时,但大多数在应用领域都有自己的优势。

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

关于Python 文本文件而不是字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24882154/

相关文章:

python - 如何编辑打印到标准输出的字符串?

c - 文件读取错误值

javascript - 从电话映射中列出有效单词

python - 如何使用理解来减少字典值中的集合?

java - 如何在 Java 中将 boolean 数组转换为二进制数组,反之亦然?

java - 我应该使用什么类型的列表/ map 来对数据进行分类但保持顺序?

python - 如果某些条件是有条件的,进行多重或比较的最有效方法是什么

python 正则表达式匹配一组中的一个或多个字符,除了特定的替代项

python - wxpython在wxpython staticbitmap中刷新图像

c++ - 在 C++ 中读取和写入二进制文件