Windows采用NTFS文件系统处理大量文件和目录时,性能如何?
在一个单一的目录中放置多少个文件或目录会导致性能问题或其他问题?是否有相关指南?
例如,将 100,000 个文件夹置于同一文件夹中是否可行?
Windows采用NTFS文件系统处理大量文件和目录时,性能如何?
在一个单一的目录中放置多少个文件或目录会导致性能问题或其他问题?是否有相关指南?
例如,将 100,000 个文件夹置于同一文件夹中是否可行?
这是一个有着数千万文件文件夹的环境下的一些建议:
针对你的问题,如果你只有100K的文件量,那就不必担心,可以随意处理。但如果文件量达到数千万级别,则需要:
a)计划将其分成子文件夹(例如,假设你有1亿个文件,最好将它们存储在1000个文件夹中,这样每个文件夹只有10万个文件,而不是存储在一个大文件夹中。这将创建1000个文件夹索引,而不是单个大索引,可能会达到最大碎片数量限制。
b)计划定期运行contig.exe 来保持大文件夹的索引整洁。
只有在无聊时才需阅读以下内容:
实际限制不在于碎片数量,而在于存储指向这些碎片的指针的数据段记录数。
因此,您拥有存储指向目录数据片段的指针的数据段。目录数据存储关于该目录所存储的子目录和子文件的信息。实际上,目录并没有“存储”任何东西。它只是一个跟踪和展示功能,为用户呈现层次结构的幻象,因为存储介质本身是线性的。
contig.exe
并指向一个目录,我认为这将完成工作:输入contig -a .
,得到以下结果:C:\temp\viele-Dateien
分为411个碎片。摘要:
处理的文件数:1
平均碎片数:411个/文件。 - Lumi在创建短文件名时,也存在性能问题会拖慢系统速度。如果您在一个文件夹中有超过300k个文件,微软建议关闭短文件名的创建[1]。前6个字符越不唯一,问题就越突出。
[1]NTFS如何工作,来源于http://technet.microsoft.com,搜索“300,000”。
(FOPS = File Operations per Second)
(DOPS = Directory Operations per Second)
#Files lg(#) FOPS FOPS2 DOPS DOPS2
10 1.00 16692 16692 16421 16312
100 2.00 16425 15943 15738 16031
120 2.08 15716 16024 15878 16122
130 2.11 15883 16124 14328 14347
160 2.20 15978 16184 11325 11128
200 2.30 16364 16052 9866 9678
210 2.32 16143 15977 9348 9547
220 2.34 16290 15909 9094 9038
230 2.36 16048 15930 9010 9094
240 2.38 15096 15725 8654 9143
250 2.40 15453 15548 8872 8472
260 2.41 14454 15053 8577 8720
300 2.48 12565 13245 8368 8361
400 2.60 11159 11462 7671 7574
500 2.70 10536 10560 7149 7331
1000 3.00 9092 9509 6569 6693
2000 3.30 8797 8810 6375 6292
10000 4.00 8084 8228 6210 6194
20000 4.30 8049 8343 5536 6100
50000 4.70 7468 7607 5364 5365
这是测试代码:
[TestCase(50000, false, Result = 50000)]
[TestCase(50000, true, Result = 50000)]
public static int TestDirPerformance(int numFilesInDir, bool testDirs) {
var files = new List<string>();
var dir = Path.GetTempPath() + "\\Sub\\" + Guid.NewGuid() + "\\";
Directory.CreateDirectory(dir);
Console.WriteLine("prepare...");
const string FILE_NAME = "\\file.txt";
for (int i = 0; i < numFilesInDir; i++) {
string filename = dir + Guid.NewGuid();
if (testDirs) {
var dirName = filename + "D";
Directory.CreateDirectory(dirName);
using (File.Create(dirName + FILE_NAME)) { }
} else {
using (File.Create(filename)) { }
}
files.Add(filename);
}
//Adding 1000 Directories didn't change File Performance
/*for (int i = 0; i < 1000; i++) {
string filename = dir + Guid.NewGuid();
Directory.CreateDirectory(filename + "D");
}*/
Console.WriteLine("measure...");
var r = new Random();
var sw = new Stopwatch();
sw.Start();
int len = 0;
int count = 0;
while (sw.ElapsedMilliseconds < 5000) {
string filename = files[r.Next(files.Count)];
string text = File.ReadAllText(testDirs ? filename + "D" + FILE_NAME : filename);
len += text.Length;
count++;
}
Console.WriteLine("{0} File Ops/sec ", count / 5);
return numFilesInDir;
}
10万应该足够了。
我(仅凭经验)观察到有人在处理数百万个文件时出现问题,我自己也曾遇到过资源管理器无法计算超过6万多个文件的情况,但对于你所讨论的存储量,NTFS 应该能够胜任。
如果你想知道,技术上(我希望是理论上)最大的文件数量为:4,294,967,295
对于本地访问,大量的目录/文件似乎不是问题。 但是,如果您通过网络访问它,则在几百个后会出现明显的性能损失(特别是从Vista机器访问)。 (从XP到Windows Server w / NTFS似乎在这方面运行得更快)。
我曾经在一个目录中处理大约10万个文件(每个文件大小几MB),这些文件都存储在NTFS文件系统中,当我在复制一个在线库时遇到了这个问题。
使用资源管理器或7-zip打开这个目录需要大约15分钟的时间。
使用winhttrack
写站点副本总是会在一段时间后被卡住。它还处理包含大约100万个文件的目录。我认为最糟糕的事情是MFT只能按顺序遍历。
在ext3上使用ext2fsd打开相同的文件需要几乎相同的时间。也许转移到reiserfs(而不是reiser4fs)可以有所帮助。
试图避免这种情况可能是最好的选择。
对于使用没有任何文件系统的二进制大对象的自己的程序可能是有益的。这就是Facebook用于存储照片的方式。
除了NTFS外,托管文件系统的服务器和远程使用文件系统的客户端也会影响NTFS的行为和性能。客户端通常使用SMB协议访问网络共享。每个Windows Server和Client版本的表现可能不同。
此外,SMB本身也可以进行调整。作为起点,请参考
针对文件服务器的性能调整| Microsoft Learnhttps://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/role/file-server/