【问题标题】:Python 3 - Faster Print & I/OPython 3 - 更快的打印和 I/O
【发布时间】:2023-03-10 23:47:01
【问题描述】:

我目前参与了一个涉及处理大量数据的 Python 项目。在这种情况下,我必须将大量数据打印到文件中。它们总是单行的,但有时包含数百万位数。

Python 中的实际数学运算最多只需要几秒钟,最多几分钟。将它们打印到文件中最多需要几个小时;我并不总是有。

有什么方法可以加快 I/O 的速度吗?
据我所知,这个数字存储在 RAM 中(或者至少我认为是这样,它是唯一会占用 11GB RAM 的东西),但 Python 不会立即将它打印到文本文件中。有没有办法将该信息(如果是数字)转储到文件中?我试过任务管理器的转储,它给了我一个 22GB 的转储文件(是的,你没看错),它看起来不像我在里面找的东西,虽然不是很清楚。

如果有所作为,我有 Python 3.5.1(Anaconda 和 Spyder)、Windows 8.1 x64 和 16GB RAM。

顺便说一句,我确实在脚本中运行 Garbage Collect(gc 模块),并删除了不需要的变量,所以这 11GB 不只是垃圾。

【问题讨论】:

  • 是写入终端还是文件?
  • @TadhgMcDonald-Jensen 一个文本文件。
  • hmmm,您也许可以将要写入的数据发送到队列并让另一个线程处理 IO,但我不确定它会不会有多大帮助。
  • @TadhgMcDonald-Jensen 这是一个有趣的想法......但是,我也不太确定它是如何工作的。 Python 没有那么灵活。

标签: python performance python-3.x file-io echo


【解决方案1】:

使用 HDF5 文件格式

问题是,你要写很多数据。

HDF5 是一种在大小上非常有效的格式,并且允许通过各种工具访问它。

准备好迎接一些挑战:

  • HDF5 有多个 python 包,您必须找到适合您需要的一个
  • 安装并不总是很简单(但可能有 Windows 安装二进制文件)
  • 希望通过学习了解要存储的数据结构。
  • 它偶尔会需要一些 CPU 周期 - 通常您会快速写入大量数据,并且有时必须将其刷新到磁盘。此时它开始压缩数据,这可能需要几秒钟。见GIL for IO bounded thread in C extension (HDF5)

无论如何,我认为,您很可能会管理文件,除了更快地写入文件之外,您还将获得更小的文件,这些文件更易于处理。

【讨论】:

    【解决方案2】:

    多线程可以加快速度(在您写入内存的其他线程上有打印机,这些线程有一个队列)。

    也许是系统设计的观点,但也许评估您是否需要将所有内容写入文件。也许考虑创建各种级别的日志记录,以便发布模式可以更快地运行(如果这在您的上下文中有意义)。

    【讨论】:

    • 我可以简化数据的唯一方法是将其显示为指数,但我会失去准确性,这是我不能允许的。然而,这是一个有趣的想法。您如何建议我创建不同的记录器?
    【解决方案3】:

    如果您确实受到写入文件所需时间的 I/O 限制,那么使用线程池的多线程可能会有所帮助。当然,这是有限制的,但至少,它允许您发出非阻塞文件写入。

    【讨论】:

    • 我建议展示(或添加链接)安全使用异步 IO 的示例,因为如果处理不当很容易损坏文件。
    • 我尝试了多线程但运气不佳,但这可能是编码错误的一些例子。除此之外,我对多线程从来都不太熟悉。你建议我怎么做?
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 2017-03-26
    • 2019-03-18
    • 2014-07-25
    • 1970-01-01
    • 2011-04-14
    • 2021-08-17
    • 2013-09-22
    相关资源
    最近更新 更多