测试:单文件夹文件数量 200W 对 WEB 访问的性能影响

kissmja 2012-12-20 09:37:20

测试环境: XP3系统 + 7200转硬盘(非SSD)+文件数量 200W个。

单文件夹文件数量 200W 对 WEB 访问的性能影响

网上查了很多资料,,,基本上人都说。。。文件数量大于 1000个对性能影响很大。。。

我知道文件数量太多,,文件夹打开会很慢。

但是这里说的是对 WEB访问 性能的影响。。关于文件打开速度慢的就别说了。。。

列表没有测试,,那个没事会把整个文件夹内的文件全部列表,,这样的操作比较少把。。。

测试了 创建文件,文件是否存在,读取文件,删除文件,访问文件属性。


测试结果:(毫秒)
WriteAllText:0
Exists:0
ReadAllText:0
GetCreationTime:0
Delete:0





文件生成:

static void test_文件夹文件生成()
{
int i = 0;

while (i++ < 2000000)
{
if ((i % 1000) == 0)
{
Console.WriteLine(" i :" + i);
}
System.IO.File.AppendAllText(@"D:\test\a_" + i + ".txt", "test");
}
}


文件性能测试

static void test_文件夹200W测试()
{
DateTime d;

string guid = "dd";


d = DateTime.Now;
System.IO.File.WriteAllText("d:/test/" + guid + ".txt", "test");
Console.WriteLine("WriteAllText:" + (DateTime.Now - d).TotalMilliseconds);
Console.WriteLine();


d = DateTime.Now;
Console.WriteLine(System.IO.File.Exists("d:/test/" + guid + ".txt"));
Console.WriteLine("Exists:" + (DateTime.Now - d).TotalMilliseconds);
Console.WriteLine();


d = DateTime.Now;
Console.WriteLine(System.IO.File.ReadAllText("d:/test/" + guid + ".txt"));
Console.WriteLine("ReadAllText:" + (DateTime.Now - d).TotalMilliseconds);
Console.WriteLine();


d = DateTime.Now;
Console.WriteLine(System.IO.File.GetCreationTime("d:/test/" + guid + ".txt"));
Console.WriteLine("GetCreationTime:" + (DateTime.Now - d).TotalMilliseconds);
Console.WriteLine();


d = DateTime.Now;
System.IO.File.Delete("d:/test/" + guid + ".txt");
Console.WriteLine("Delete:" + (DateTime.Now - d).TotalMilliseconds);
Console.WriteLine();
}
...全文
684 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kissmja 2012-12-21
  • 打赏
  • 举报
回复
引用 20 楼 fenix124 的回复:
之前用lucene.net对文件夹下面.html文件建立索引,速度非常慢,电脑卡得要死,因为文件夹下面.html文件太多了,具体多少不太清楚,可能上万了。
这个不管是多级子目录 还是 单文件存储所有文件。。。。速度都慢把。。 比如文件夹下面 有 10W个HTML文件。。。你索引的话 多级子目录也要索引10W个。。单文件夹存放也要索引10W个。
kissmja 2012-12-21
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
引用 11 楼 kissmja 的回复:引用 10 楼 caozhy 的回复:比如把这些文件通过ftp传输到另一台主机上。 直接 zip 打包就好了 感觉。。文件全部在一个文件打包速度比分散要快多了。。。 我以前一个网站。。有20多W个文件。。。打包要很长时间。主要是搜索文件那里。。 我今天测试下。。。200W文件在一个目录。。。搜索文件……
主题都都说了。。。关于文件夹打开速度慢的就别说了。。。 WEB服务器谁没事天天去看看有多少个文件。。 这里讨论的是 IIS服务器多目录内文件很多的情况下,,,,是否会影响WEB访问的性能。。。 另外的 “搜索文件” 是指 zip 压缩的时候,,,zip压缩前会给文件列表。。。你可以试下。。超过1W以上才会看到。。文件少,,那个“搜索”你就看不到呢。
fenix124 2012-12-21
  • 打赏
  • 举报
回复
之前用lucene.net对文件夹下面.html文件建立索引,速度非常慢,电脑卡得要死,因为文件夹下面.html文件太多了,具体多少不太清楚,可能上万了。
  • 打赏
  • 举报
回复
引用 11 楼 kissmja 的回复:
引用 10 楼 caozhy 的回复:比如把这些文件通过ftp传输到另一台主机上。 直接 zip 打包就好了 感觉。。文件全部在一个文件打包速度比分散要快多了。。。 我以前一个网站。。有20多W个文件。。。打包要很长时间。主要是搜索文件那里。。 我今天测试下。。。200W文件在一个目录。。。搜索文件那里很快就好了。。。 文件上传……
“搜索文件”是指什么呢?比如说“文件中的的一行包括‘我、你、她’三个字”为搜索条件吗? 对于windows xp、2003甚至是2008很慢。但是放到windows 8好像就快了不少。 或者虽然是windows nt server但是是使用SCSI的硬盘就很快。
  • 打赏
  • 举报
回复
比如说一小块区域(仅仅北京的城八区这么小的地方)我们就有几十万文件,更何况全中国、全世界的访问。 然后我仅仅要看一下北京饭店所在的那一个文件,打开windows文件夹,晕死了,它竟然列目录要等上5分钟,我才能点击这个文件打开它! 于是我们按照文件的某处3个字母先自动创建一层文件夹,然后再按照文件的另外一处3个字母再创建第二层文件夹,这回好了,每一个文件夹里边最多只有1000个子文件夹,不超过一千个文件(目前最多只有几十个文件),这下去手工打开特定的文件就又快又方便了。 程序访问起来当然也不慢。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
理论上应该不会,除非你有杀毒软件或者其他shellhandler。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
发现一个比较满的操作。。 文件夹改名。。。我去给文件夹改名。。。卡顿了大约30秒。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
引用 13 楼 kissmja 的回复:
引用 10 楼 caozhy 的回复:比如把这些文件通过ftp传输到另一台主机上。 那是否说明。。。。单文件数量 200W 对 WEB 访问性能没有影响呢。。
驴头不对马嘴的问题。文件数量和你性能当然没有关系,有关系取决于你的代码逻辑是否为此耗费时间。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
引用 10 楼 caozhy 的回复:
比如把这些文件通过ftp传输到另一台主机上。
那是否说明。。。。单文件数量 200W 对 WEB 访问性能没有影响呢。。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
引用 11 楼 kissmja 的回复:
引用 10 楼 caozhy 的回复:比如把这些文件通过ftp传输到另一台主机上。 直接 zip 打包就好了 感觉。。文件全部在一个文件打包速度比分散要快多了。。。 我以前一个网站。。有20多W个文件。。。打包要很长时间。主要是搜索文件那里。。 我今天测试下。。。200W文件在一个目录。。。搜索文件那里很快就好了。。。 文件上传……
搜索文件和定位文件是两个概念。对于ntfs,给定一个路径,找到这个文件,并不需要“搜索文件夹”。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
引用 10 楼 caozhy 的回复:
比如把这些文件通过ftp传输到另一台主机上。
直接 zip 打包就好了 感觉。。文件全部在一个文件打包速度比分散要快多了。。。 我以前一个网站。。有20多W个文件。。。打包要很长时间。主要是搜索文件那里。。 我今天测试下。。。200W文件在一个目录。。。搜索文件那里很快就好了。。。 文件上传的话。。。只要关闭FTP的列表应该也很快。。。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
比如把这些文件通过ftp传输到另一台主机上。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
不知道除了 文件列表 以外,,, 还有那些操作 文件夹数量200W 会影响性能。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
引用 6 楼 kissmja 的回复:我当然是先生成好了。。。然后在测试呀。 我多次测试。。不可能每次测试。。都生成200W的文件。。。 那你不过是测试文件系统定位文件的速度,对于NTFS,这个效率本来就是很高的。
所有文件放一个目录,一般都是, HTML文件 和 附件 所有只测试呢:创建文件,文件是否存在,读取文件,删除文件,访问文件属性。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
引用 6 楼 kissmja 的回复:
我当然是先生成好了。。。然后在测试呀。 我多次测试。。不可能每次测试。。都生成200W的文件。。。
那你不过是测试文件系统定位文件的速度,对于NTFS,这个效率本来就是很高的。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
我当然是先生成好了。。。然后在测试呀。 我多次测试。。不可能每次测试。。都生成200W的文件。。。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
引用 3 楼 kissmja 的回复:
引用 1 楼 caozhy 的回复:(1)没看到你任何关于产生200万文件的代码逻辑 (2)操作系统有文件缓存机制,对于现代的系统,操作系统甚至会使用数GB的内存作为缓存隐藏硬盘的IO延迟。所以时间为0不足为奇。 (3)该用SSD还是用SSD。 文件生成的代码我给出了呀。。。在下面。。。。。 static void test_文件夹文件生成() ……
但是没有看到你的调用。
threenewbee 2012-12-20
  • 打赏
  • 举报
回复
对于FAT32文件系统,每个目录最大文件数是65536个,而不是无限多,对于某些软件,比如磁盘压缩和WinZip的早期版本,也不支持超过一定数量的文件。你的所谓“优化”毫无意义。
kissmja 2012-12-20
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
(1)没看到你任何关于产生200万文件的代码逻辑 (2)操作系统有文件缓存机制,对于现代的系统,操作系统甚至会使用数GB的内存作为缓存隐藏硬盘的IO延迟。所以时间为0不足为奇。 (3)该用SSD还是用SSD。
文件生成的代码我给出了呀。。。在下面。。。。。 static void test_文件夹文件生成() { int i = 0; while (i++ < 2000000) { if ((i % 1000) == 0) { Console.WriteLine(" i :" + i); } System.IO.File.AppendAllText(@"D:\test\a_" + i + ".txt", "test"); } }
kissmja 2012-12-20
  • 打赏
  • 举报
回复
测试结果是,,,除非你需要经常 把文件夹内的所有文件列表 否则不需要 按月日 等来存储文件,,, 所有文件存到一个文件夹的好处就是。。 文件管理方便。直接搞个 Exists 就知道文件是否存在呢。。。 URL 结构简单。。都不用伪静态呢。。。 上传的话(设置下不用列表,,这样速度应该也没影响。)
加载更多回复(1)

111,083

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧