Python文本文件而不是字典

Python文本文件而不是字典,python,file-io,dictionary,Python,File Io,Dictionary,我正在做一个项目,在这个项目中,我爬网并将大量数据重新组织到一个结果文本文件中。以前我使用dictionary来存储临时数据,但随着数据量的增加,由于内存使用和dictionary变得无用,进程会减慢 由于进程速度在我的例子中并不重要,所以我尝试将字典替换为文件,但我不确定如何轻松地将文件指针移动到适当的位置并读取所需的数据。在字典里我可以很容易地查阅任何资料。我想实现同样的目标,但在文件中 我正在考虑使用mmap并编写自己的函数来移动文件指针。Python是否有用于此类操作的内置模块或第三方模

我正在做一个项目,在这个项目中,我爬网并将大量数据重新组织到一个结果文本文件中。以前我使用dictionary来存储临时数据,但随着数据量的增加,由于内存使用和dictionary变得无用,进程会减慢

由于进程速度在我的例子中并不重要,所以我尝试将字典替换为文件,但我不确定如何轻松地将文件指针移动到适当的位置并读取所需的数据。在字典里我可以很容易地查阅任何资料。我想实现同样的目标,但在文件中

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


任何其他理论方法都是受欢迎的。

我认为您现在正试图重新创建一个关键价值数据库

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

当然,
sqlite3
不是键值DB(表面上),因此如果您需要更简单的东西,请查看LMDB及其Python绑定:

它的重量轻,速度快。这可能是实现你想要的最快的方法


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

  • 你读得多还是写得多
  • 键和值的大小是多少
  • 您是否需要交易/防崩溃
  • 是否有重复的键(一个键,多个值)
  • 是否要对键进行排序
  • 是否要按插入顺序读取数据
  • 您的数据库大小是多少(MB、GB、TB、PB)
  • 您是否受限于IO或CPU
例如,我上面建议的LMDB在读密集型任务中非常好,而在写密集型任务中则不太好。它提供事务,按排序顺序保存密钥,并且是防崩溃的(受底层文件系统的限制)。但是,如果需要经常编写数据库,LMDB可能不是最佳选择

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

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


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

我认为您现在正在尝试重新创建键值数据库

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

当然,
sqlite3
不是键值DB(表面上),因此如果您需要更简单的东西,请查看LMDB及其Python绑定:

它的重量轻,速度快。这可能是实现你想要的最快的方法


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

  • 你读得多还是写得多
  • 键和值的大小是多少
  • 您是否需要交易/防崩溃
  • 是否有重复的键(一个键,多个值)
  • 是否要对键进行排序
  • 是否要按插入顺序读取数据
  • 您的数据库大小是多少(MB、GB、TB、PB)
  • 您是否受限于IO或CPU
例如,我上面建议的LMDB在读密集型任务中非常好,而在写密集型任务中则不太好。它提供事务,按排序顺序保存密钥,并且是防崩溃的(受底层文件系统的限制)。但是,如果需要经常编写数据库,LMDB可能不是最佳选择

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

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


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

感谢您的快速响应!我两个都试试。基于DrV的想法,我在谷歌上搜索了“python的键值数据库”,结果发现这里还有另一个开发良好的线程,所以在这个主题中:@g0m3z:在这个线程中有很多很好的讨论。然而,当时并不存在所有现代系统。另外,我认为您不应该开始评估分布式或其他非常复杂的系统,因为您的任务很简单