Filesystems 在WindowsNT上读取和解析数百万文件的最佳方法是什么

Filesystems 在WindowsNT上读取和解析数百万文件的最佳方法是什么,filesystems,ntfs,Filesystems,Ntfs,我在一个目录中有数百万个文件(在有许多子目录的目录中), 这些文件都是小文件 我认为有两个挑战: 如何遍历目录以查找所有文件。我尝试了“FindFirstFile/FindNextFile”方式,但我觉得太慢了。我应该使用Windows更改日志吗 在找到所有文件名后,我需要将整个文件读取到内存中,然后对其进行解析。我是否应该使用file\u标志\u SEQUENTIAL\u SCAN标志?还是有更有效的方法 有一些好主意 文本爬虫-Windows搜索工具- Microsoft日志分析器- 如果

我在一个目录中有数百万个文件(在有许多子目录的目录中), 这些文件都是小文件

我认为有两个挑战:

  • 如何遍历目录以查找所有文件。我尝试了“FindFirstFile/FindNextFile”方式,但我觉得太慢了。我应该使用Windows更改日志吗

  • 在找到所有文件名后,我需要将整个文件读取到内存中,然后对其进行解析。我是否应该使用file\u标志\u SEQUENTIAL\u SCAN标志?还是有更有效的方法


  • 有一些好主意

    • 文本爬虫-Windows搜索工具-
    • Microsoft日志分析器-
    • 如果您的SQL(或MySQL)服务器有足够的空间,则可以设置SQL作业来导入/链接到相关文件,然后可以查询它们

    我担心的是,如果将文件内容加载到内存中,服务器内存将很快用完。您需要做的是找到有问题的文件,并将结果写入日志或报告中,您可以对其进行解析和解释。

    NTFS,或者事实上,任何非专用文件系统处理数百万小文件的速度都很慢。这是数据库的领域

    如果文件实际上很小,那么如何读取它们根本不重要。管理费用将占主导地位。使用第二个线程可能是值得的,但第三个线程不太可能有进一步的帮助

    另外,使用
    FindFirstFileEx
    加快搜索速度。您不需要其他文件名,但希望使用较大的缓冲区。

    您可以使用较大的缓冲区(例如64 KB)来查询子项。
    此函数是与文件系统通信的最快速度的绝对限制


    如果这对您不起作用,您可以直接读取NTFS文件表,但这意味着您必须具有管理权限,并且需要手动实现文件系统读取器。

    我认为将整个文件读入内存可以提高效率。也许我错了。我需要写一个程序来证明它。到底有多慢?
    FindFirstFile
    需要多长时间?虽然我非常喜欢Windows,但我认为使用ext3或ext4的Linux处理大量文件的速度要比NTFS快得多。我实际上已经编写了一个ext3引导加载程序(简单,与ext2相同),我不同意。你真的想要一个文件名的结构化存储,ext3中的列表效率不高。我并不是说它比数据库(或更适合这个任务的东西)明显更高效,但你是说它不比NTFS快吗?我很确定这是…@Mehrdad:取决于手头的具体任务,但例如,从包含1000个文件的目录中按名称选择一个文件在NTFS上是O(logn),在ext3上是O(N)。呃,我指的是OP关注的操作,“遍历目录以查找所有文件”,而不是一些随机任务。你真的能说NTFS在这方面更快吗?因为我很确定它不是。我设置了文本爬虫,我使用apimon来查看api调用。我发现它使用FindFirstFile/findNext文件。