多个文件句柄会减慢写入速度吗?
在Python中,打开一个文件的过程相比于实际写入的时间来说,是不是比较慢呢?
一个大文件,一个文件处理器
import marshal
bigDataStructure = [[1000000.0 for j in range(1000000)] for i in range(1000000)]
f = open('bigFile' , 'w')
marshal.dump(bigDataStructure , f)
f.close()
多个小文件,多个文件处理器
for i , row in enumerate(bigDataStructure):
f = open(str(i) , 'w'):
marshal.dump(row , f)
f.close()
2 个回答
我想说,使用多个文件处理器的方法可能会比较慢,因为每次调用close()
操作时,都会向文件系统写入数据。如果你一次写入的数据很小,这样做会更慢(因为你写入的数据可能少于一个扇区的大小),不如让底层的系统(操作系统、文件系统、块设备)来处理缓存和写入,这样可以避免浪费很多小于扇区大小的写入操作。
你提到如果把所有神经元合并在一起会耗尽内存——这可真是个“大”工程。(根据我的经验,几百个神经元就足够我们在计算机科学课程中写的小程序了。)
你可能不想为存储10万个神经元而创建10万个单独的文件——更不用说为存储100万个神经元而创建100万个文件了。频繁查找目录、打开文件、读取、关闭文件,以及进行少量的输入输出操作,会让加载和保存大量神经元变得非常慢。
当然,如果你只考虑50或100个神经元,那无论如何都能很快完成,或许最简单的实现方式就足够了。
但如果是我的话,我会认真考虑为神经元构建好的数据结构:也许你可以用一个整数来表示神经元的类型,再用一个整数或浮点数的数组来描述每个神经元的特征,这样一组神经元的描述就可以很方便地写入单独的文件或一个文件中,哪个更简单就用哪个。
如果你的神经元在同一层中类型不同,或者层与层之间没有完全连接,你可能会发现一些稀疏矩阵存储的设计对描述所有神经元的更大数据结构很有用。
也许真正的问题应该是“我该如何改善神经元的存储方式?”
更新
我认为即使是1万个神经元,也值得创建一个“合并”的存储格式。我刚刚创建了1万个小文件,清空了缓存以测试冷启动,然后逐个重新读取每个文件。读取1万个文件花了14.6秒,而读取一个包含相同数据的单个文件只花了0.1秒。
如果你的网络每年“冷启动”一次,可能影响不大。但如果你的网络每天要冷启动十几次,你可能会对这种简单的存储格式感到厌烦。