【问题标题】:Writing data to disk in a disk-friendly way?以磁盘友好的方式将数据写入磁盘?
【发布时间】:2017-10-12 17:12:14
【问题描述】:

我想知道是否可以在我的 python 代码中做任何事情,使i/o 对磁盘更友好?

我知道,默认情况下,open() 使用启发式确定的缓冲区,其大小与磁盘的blocksize 相同。

据我了解,这仅决定数据何时刷新到磁盘缓存。这是正确的吗?

我有以下场景:

我正在连接各种不断流式传输数据的 websocket。我需要将此数据写入磁盘。理想情况下,我在接收和i/o 操作之间的延迟尽可能小,同时不会使用i/o 命令破坏我的磁盘。

我已经在使用单个线程来写入所有数据,而不是从各个线程中删除数据 (as has been pointed out here)。但我想知道将缓冲区设置为除default 之外的任何其他内容是否有意义?

我意识到无论如何负载都会令人望而生畏,但我很好奇在为这种情况编写 python 代码时是否有任何最佳实践来实现磁盘友好。

目前,我只是这样做:

with open(file, 'wb') as f:
    f.write("stuff")

【问题讨论】:

  • 硬盘和操作系统的缓存/缓冲是最便宜的优化,我想说 - 你确定你在弯曲自己的代码之前已经优化了吗?
  • “最理想的情况是,接收和 i/o 操作之间的延迟尽可能小”听起来很柔和。为什么需要快速 i/o 操作?
  • @tiwo,因为我想确保万一我的机器着火(比喻地说),我会丢失尽可能少的数据。

标签: python python-3.x io


【解决方案1】:

但我想知道将缓冲区设置为除此处的默认值之外的任何其他值是否有意义?

它可能 - 但您看到的任何性能改进都很大程度上取决于您运行的系统 - 操作系统、文件系统、硬件,甚至数据在磁盘上的布局方式。因此,当文件被创建、写入、修改和删除时,您的性能甚至可能在很大程度上取决于文件系统使用的过去历史。将存储从单个本地 5400-rpm SATA 驱动器更改为具有 15K-rpm SAS 驱动器的 RAID-6 阵列的 NAS 系统?您的答案可能会有所不同。

唯一真正了解的方法是在您计划使用它的系统上对其进行测试。或者至少一个尽可能相同的。您需要使用您的进程实际执行的相同模式的 I/O 操作进行测试。如果您的 I/O 模式是从随机位置进行少量读取,那么执行大量顺序写入是没有意义的。

最后,除非您运行在一个实际设计用于处理您的特定 I/O 模式的系统上,否则您可能会得出结论,不值得付出所有测试的努力。

【讨论】:

    【解决方案2】:

    无论您最终使用什么,我都建议您使用“IPython %timeit”尝试每种方法,并比较最适合您的数据和硬件的方法。

    这是一个分块写入器的简单示例。 ASCII 字符(一次一个)被加载到 writeBuff 中。当写入缓冲区达到 1024 个字符时,该块被写入磁盘。

    import string
    import random
    import time
    
    totalLength = 2**20
    charsWritten = 0
    writeBuff = ""
    
    f = open("myFile.txt", "w")
    while charsWritten < totalLength:
        writeBuff += random.choice(string.ascii_letters)
        charsWritten += 1
        if len(writeBuff) == 1024:
            f.write(writeBuff)
            writeBuff = ""    
    f.write(writeBuff)
    f.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2021-08-18
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多