我有一个由 2 个十六进制数字定义的 3 级目录结构,如下所示:
0A/FF/2B/someimagefile.gif
我有 1.5TB 压缩文件中的 300M 个小文件,这些文件将填充这些目录(我们将来会有更多的文件,因此我选择了目录结构来防止大量文件崩溃典型的 extX 文件系统)。
解压这些文件的速度为每秒 1MB(或解压约 18 天)。哎哟!
我猜是因为我要先创建目录结构,然后再创建文件(通过 Java API 完成),所以速度很慢。所以我打算在 bash 循环中单独创建目录结构。
按目前的速度,仅目录一项就需要大约 5 天的时间。
关于提高移动速度有什么想法吗?
更新
难题的一部分已经解决,使用 perl 而不是 bash,创建目录的速度提高了 200 多倍,现在它是一个让您喝杯咖啡休息一下的操作,而不是延长周末休息时间。
但即使不需要创建目录,文件创建仍然非常慢。
答案1
我对此的最终回答是:“不要这样做”。
在创建许多小文件时,我找不到将速度提高到 2Mbytes/sec 以上的方法。对于 TB 级数据量来说,这实在是太难以克服的惯性了。
我们正在追随 Facebook 的脚步,将文件转储到二进制数据存储(或使用带有 BLOB 的大型 mysql/myisam 表,正在实验......)。
它有点复杂,但消除了与小文件相关的随机搜索问题,我可以在几小时或一天内(而不是几周)处理 TB 量的数据。
MongoDB 是另一个值得研究的好选择。
答案2
使用 noatime、nodiratime 选项重新挂载文件系统