在 Windows 7(64 位)下,我正在读取 9000 个中等大小的文件。总共有超过 200 MB 的数据。我使用 Java(JDK 1.6.21)对这些文件进行迭代。前 1400 个左右全速运行,但随后速度下降到每个文件 4ms。事实证明,主要成本仅仅是打开文件产生的。
我正在使用打开文件new FileInputStream
(当然,及时关闭它们以避免文件泄漏)。经过一番调查,我发现 Windows 的磁盘缓存只使用了 100 MB 左右的 RAM,尽管我有 8 GiB 可用。我尝试使用缓存集工具,但我提供的任何值都会被考虑超出范围。
我也尝试启用LargeSystemCache
注册表项,但(重新启动后)该CacheSet
工具仍显示我正在使用 100 MB 的缓存(并且在测试运行期间不会增加)。有人有什么建议可以“鼓励”Windows 7 缓存我的 9000 个文件吗?
答案1
我尝试使用 CacheSet 工具增加缓存大小,但我提供的任何值都被视为超出范围。
- 确保明确以“管理员身份”运行 CacheSet。当任何事物出错。
- 确保缓存大小可以被 4 KB 整除
另外,我注意到 CacheSet 在处理较大值时会遇到一些问题,可能是因为它是 2006 年推出的 32 位应用程序。我根据相同的 API 编写了一个 64 位程序,允许设置超过 4GB 的缓存大小:http://blog.thecybershadow.net/2012/12/14/64-bit-cacheset/
注意:CacheSet 文章提到了 CacheMan,然而最新版本似乎使用与 CacheSet 相同的 API - 它只是被打包成一个带有一堆预设和其他功能的 UI。
答案2
Superfetch 不会缓存大文件的所有内容,只会缓存被访问的部分。因此,访问该文件仍然需要读取磁盘。像我这样的 210mb 磁盘缓存可以缓存 Windows 中所有这些小文件的所有内容。而且性能非常显著。但我怀疑,这是否会对更快的系统产生影响。
答案3
我知道这已经过时了,但是对于遇到此问题的其他人来说:您需要手动以管理权限运行 CacheSet。如果不这样做,您将收到 OutOfRange 错误;它将不会自动请求权限。