带NTFS的Windows如何使用大量文件和目录?
在遇到性能问题或其他问题之前,是否有关于可以放在单个目录中的文件或目录限制的指导?
例如,在其中有一个包含100,000个文件夹的文件夹,这是一件好事吗?
我正在编写一个应该处理许多小文件的程序,比如数千甚至数百万.我一直在测试500k文件的那一部分,第一步就是迭代一个目录,里面有大约45k目录(包括子目录的子目录等)和500k小文件.遍历所有目录和文件,包括获取文件大小和计算总大小大约需要6秒.现在,如果我尝试在遍历时打开每个文件并立即关闭它,它看起来永远不会停止.事实上,它需要太长时间(小时......).自从我在Windows上执行此操作后,我尝试使用CreateFileW,_wfopen和_wopen打开文件.我没有在文件上读或写任何东西,尽管在最后的实现中我只需要阅读.但是,我没有看到任何尝试都有明显的改善.
我想知道是否有一种更有效的方法来打开具有任何可用功能的文件,无论是C,C++还是Windows API,或者唯一更有效的方式是读取MFT并直接读取磁盘块,我我想避免?
更新:我正在处理的应用程序是使用版本控制进行备份快照.因此,它还具有增量备份.500k文件的测试是在一个巨大的源代码库上完成的,以便进行版本控制,就像scm一样.因此,所有文件都不在一个目录中.还有大约45k目录(如上所述).
因此,建议的压缩文件解决方案没有帮助,因为当备份完成时,就是访问所有文件的时候.因此,我认为没有任何好处,甚至会产生一些性能成本.
我想运行一个机器学习算法作为我的最终研究代码,该代码迄今为止尚未经过验证且未发布用于文本挖掘目的。文本已经获得,但是是从 Common Crawl 获得的 warc 格式中刮取的。我正在为机器学习目的准备数据,所需的分析任务之一是在启动 ML 应用程序之前对语料库进行 IDF(逆文档频率分析)。
据我了解,为了让 IDF 发挥作用,每个文件应该代表一个发言者或一个想法——通常是一小段 ASCII 文本,不比一条推文长多少。挑战在于我已经抓取了大约 1500 万个文件。我在 Windows 7 上使用 Strawberry Perl 读取每个文件并拆分文档中包含的标签,以便来自相关社交媒体的每个评论落入数组的一个元素中(并且在更强类型的语言中将是字符串类型)。
从这里我遇到了性能问题。我让我的脚本运行一整天,但它在 24 小时内只处理了 400,000 个输入文件。从这些输入文件中,它生成了大约 200 万个输出文件,代表每个说话者使用 Perl 的 HTML::Strip 模块处理 html 剥离文本的一个文件。当我查看我的系统时,我发现本地数据驱动器上的磁盘利用率非常高 - 有大量 ASCII 文本写入,远小于 1 KB,每个写入都被塞进本地数据驱动器的 1 KB 扇区中NTFS 格式的硬盘。
是否值得尝试停止运行,在我的家庭系统上设置一个 MySQL 数据库,在数据库中设置一个最大长度可能为 500-1000 个字符的文本字段,然后重新运行 perl 脚本以使其吸收输入html 文件,分割它,HTML 剥离它,然后准备并执行字符串插入与数据库表?
一般来说,从包含大量单独文本文件的文件输出格式切换到包含大量数据库插入的格式在我的硬盘驱动器上会更容易/从长远来看由于某些缓存或更快的写出速度DBMS 中的 RAM/磁盘空间利用魔法?
ntfs ×2
performance ×2
windows ×2
c++ ×1
filesystems ×1
mysql ×1
optimization ×1
perl ×1
text ×1