Windows 7 个包含超过 10 万个小 (30 kB) 文件的目录性能急剧下降
Windows 7 directory with over million small (30 kB) files dramatic performance decrease
我在生成和使用大量小文件时遇到了有关脚本性能的问题。
我的磁盘上有两个目录(HDD 和 SSD 上的行为相同)。首先是 ~10_000 输入文件,其次是 ~1_300_000 输出文件。我编写了脚本来处理文件并使用 Python 中的 multiprocessing
库生成输出。
第一个输出 400_000-600_files(不确定我何时点击 'threshold')以恒定的速度生成,并且 CPU 的所有 8 个核心都以 100% 使用。然后情况变得更糟。当命中目录中的 1_000_000 个文件时,性能下降 20 倍,核心使用率下降到 1-3%。
我通过创建第二个输出目录并在那里写入输出文件的后半部分来省略这个问题(我需要快速修补程序)。
现在,我有两个问题:
1) 如何在 Windows 上的 Python 中创建新的并写入它?这里的瓶颈是什么? (我的猜测是 Windows 在写入文件之前查找文件是否已存在于目录中)
2) 有什么更优雅的方式(而不是拆分成目录)来正确处理这个问题?
如果有人遇到同样的问题,瓶颈原来是在拥挤的目录中查找文件的时间。
我通过将文件拆分到单独的目录中解决了这个问题,这些目录由一个参数分组,均匀分布在 20 个不同的变量中。虽然现在我会用不同的方式来做。
我建议使用 shelve
Python 内置模块解决类似问题。 shelve
是文件系统中的一个文件,您可以像访问字典一样访问它并将 pickles
放入其中。就像在现实生活中一样:) Example here.
我在生成和使用大量小文件时遇到了有关脚本性能的问题。
我的磁盘上有两个目录(HDD 和 SSD 上的行为相同)。首先是 ~10_000 输入文件,其次是 ~1_300_000 输出文件。我编写了脚本来处理文件并使用 Python 中的 multiprocessing
库生成输出。
第一个输出 400_000-600_files(不确定我何时点击 'threshold')以恒定的速度生成,并且 CPU 的所有 8 个核心都以 100% 使用。然后情况变得更糟。当命中目录中的 1_000_000 个文件时,性能下降 20 倍,核心使用率下降到 1-3%。
我通过创建第二个输出目录并在那里写入输出文件的后半部分来省略这个问题(我需要快速修补程序)。
现在,我有两个问题:
1) 如何在 Windows 上的 Python 中创建新的并写入它?这里的瓶颈是什么? (我的猜测是 Windows 在写入文件之前查找文件是否已存在于目录中)
2) 有什么更优雅的方式(而不是拆分成目录)来正确处理这个问题?
如果有人遇到同样的问题,瓶颈原来是在拥挤的目录中查找文件的时间。
我通过将文件拆分到单独的目录中解决了这个问题,这些目录由一个参数分组,均匀分布在 20 个不同的变量中。虽然现在我会用不同的方式来做。
我建议使用 shelve
Python 内置模块解决类似问题。 shelve
是文件系统中的一个文件,您可以像访问字典一样访问它并将 pickles
放入其中。就像在现实生活中一样:) Example here.