以磁盘友好的方式将数据写入磁盘?

时间:2017-05-13 13:28:50

标签: python python-3.x io

我想知道在我的python代码中是否可以执行任何操作,这会使i/o更加友好?

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

据我所知,这只能确定何时将数据刷新到磁盘的缓存中。这是对的吗?

我有以下情况:

我正在连接各种不断传输数据的websockets。我需要将这些数据写入磁盘。最理想的是,我在接收和i/o动作之间尽可能地滞后,而不是用i/o命令谋杀我的磁盘。

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

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

目前,我只是这样做:

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

  

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

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

唯一真正知道的方法是测试它 - 在您计划使用它的系统上。或者至少有一个与你能做到的相同。并且您需要使用您的进程实际执行的相同I / O操作模式进行测试。如果您的I / O模式是从随机位置读取的小数据,则执行大量顺序写入是没有意义的。

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