【问题标题】:Python text file instead of dictionaryPython文本文件而不是字典
【发布时间】:2014-09-12 23:09:53
【问题描述】:

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

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

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

欢迎任何其他理论方法。

【问题讨论】:

    标签: python file-io dictionary


    【解决方案1】:

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

    也许最简单的方法是检查sqlite3 模块是否能满足您的需求。使用现成的数据库比滚动自己的数据库更容易!

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

    它既轻巧又快速。这可能是实现您想要的最快的方法。


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

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

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

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

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

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

    【讨论】:

    • 感谢您的及时回复!我会尝试两个。
    • 基于 DrV 的想法,我在 Google 上搜索了“python 的键值数据库”,结果发现在这个主题中还有另一个开发良好的线程:link
    • @g0m3z:该线程中有很多很好的讨论。然而,那时所有的现代系统都不存在。另外,我认为您不应该开始评估分布式或其他非常复杂的系统,因为您的任务很简单。从基于单文件的文件开始。就个人而言,我会尝试 SQLite,如果它不是太慢就使用它,而忘记理论上的考虑。
    • 同时,我对 SQLite 进行了投票,原因有两个。首先,我对 SQLite 有一点了解,其次,正如您提到的,我的任务目前还没有那么复杂。如果它随着时间的推移而改变,我会重新考虑使用其他东西。再次感谢您的宝贵时间和宝贵的 cmets!
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2015-09-27
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多