【发布时间】:2011-11-17 20:38:19
【问题描述】:
我需要在启动时读取数千个小文件的内容。在 linux 上,只使用 fopen 和阅读速度非常快。在 Windows 上,这发生得非常缓慢。
我已切换到使用 ReadFileEx 使用重叠 I/O(异步 I/O),当数据准备好读取时,Windows 会执行回调。
但是,实际上对 CreateFile 本身的数千次调用仍然是一个瓶颈。请注意,我提供自己的缓冲区,打开 NO_BUFFERING 标志,提供 SERIAL 提示等。但是,对 CreateFile 的调用需要 10 秒,而在 linux 上一切都完成得更快。
有什么办法可以让这些文件准备好以便更快地阅读?
对 CreateFile 的调用是:
hFile = CreateFile(szFullFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
【问题讨论】:
-
有可能是文件系统的瓶颈,是否可以使用平面文件而不是读取数千个小文件?
-
Windows 在处理一个目录中的大量文件方面是出了名的糟糕,如果这是您的情况。多线程是一种选择,所以您将有 10 个线程同时进行读取?
-
你应该看看这个问题stackoverflow.com/questions/197162/…
-
嗨,我们有 12,000 个文件,而不是数百万个。我们只关心阅读信息,而不是编写信息。是的,文件系统很可能是瓶颈。不,这些文件并不都在一个目录中,它们分散在大约 300 个目录中。
-
您是否运行了防病毒软件?您是否尝试过从扫描中排除相关文件夹?
标签: windows performance winapi file-io io