百科问答小站 logo
百科问答小站 font logo



为什么 Steam 删除 80G 的游戏只用了一秒? 第1页

  

user avatar   pansz 网友的相关建议: 
      

粗一看这是个简单的问题,仔细一想,事情并没有那么简单。

首先我说另外个事:
平时我删文件也是秒删的,因为我一般会启用回收站,并且去掉【确认删除】的对话框。因此只要目录尺寸不超过回收站大小,点击删除键一定就是秒删。

回收站秒删的原理在于:它只删除了父目录,目录内的所有文件跟子目录根本就不需要动。因此无论目录有多大,里面有多少个文件,删除的都只有最高一级目录,无论目录有多大都等同于只删除了一个单一文件,所以回收站删除会比删除几千个文件要快。

——

现在来说题主的问题,题主的问题是删80G的游戏,而这个游戏的空间大于大多数用户的回收站大小,因此正常情况下,它的删除必定会触发真正的删除流程,要删除的文件如果很多,就会稍微慢一些。但 steam 删除得很快,推测有几种可能:

  1. steam其实在后台删除,只不过先告诉你删完了,实际上他还在后台继续做删除工作呢。
  2. steam使用了类似windows回收站的机制,删除的瞬间直接把游戏移动到steam内部的私有回收站,这样的操作就必定极快,给用户造成了秒删除的感觉。
  3. 前两者结合,先移动到私有回收站让你看起来游戏已经没了,然后在后台继续做删除工作。steam的空间预分配,或许本质上就是它的私有回收站。
  4. 题主的硬盘真的就那么快,80G确实可以秒删,现在的高速NVME结合操作系统缓存或许真能做到。
  5. 可能还有其它可能,但具体情况要具体分析。

具体哪种可能,题主自己研究一下具体情况吧。


user avatar   mu-tou-long 网友的相关建议: 
      

这个问题下截止到目前的回答还没看到一个特别准确的。


既然是80G的Steam游戏,默认操作系统是Windows,文件系统是NTFS。Windows支持的其它文件系统,FAT/FAT32分区最大只有8G/32G(理论上FAT32分区大小可以是2T,但Windows不允许用FAT32格式化大于32G的分区),放不下80G的游戏,exFAT默认只能用来格式化移动存储设备不能用来格式化固定磁盘,所以这个问题下用FAT来解释的回答大概率都是错的。ReFS估计没几个人在用吧?


在NTFS分区里面,一个文件,根据文件大小的不同,有3处或者5处相关的信息:

  1. 在$MFT里面的FILE记录,大小固定为1K。$MFT(Master File Table,主文件表)是NTFS最重要的文件,默认隐藏不能访问,记录着这个分区内所有的目录和文件信息。一个文件在$MFT里面的记录主要记录了文件名、所在文件夹的记录号、大小、创建/上次修改/上次修改$MFT记录/上次访问时间等属性。如果这条1K记录剩余的空间大于文件大小,使用一个特殊的属性直接在记录中保存文件的数据,这个属性在NTFS称为常驻属性;如果剩余空间小于文件大小,文件数据需要使用额外的簇保存,使用另一种属性记录这个保存这个文件数据所占用的簇,这个属性称为非常驻属性。
  2. 在上级文件夹的索引数据中的记录,大小不定,通常在88~600字节之间。每个文件夹(包括根目录)在内,会记录本文件夹下所有子文件夹、文件的信息,包括文件在$MFT里面的记录号、大小、创建/上次修改/上次修改$MFT记录/上次访问时间等属性,这些信息占用82字节。此外还有这个文件/子文件夹的文件名,最大255个字符,每个字符占使用unicode编码,占两个字节。最后会补齐8个字节。此外,为了兼容DOS的8.3文件名,每个文件/子文件夹通常会有另一条文件名是8.3格式的记录,这条记录的大小一般不会大于96字节。
  3. 在$Secure里面的记录,数量和大小不定。$Secure记录每个文件的权限,例如某个用户/组对这个文件具有什么样的权限。对于家用情况,没多少用户/组,一个文件的权限数据通常很小不会超过4K。
  4. 在$Bitmap中对应的位。NTFS分区中每一簇按顺序对应$Bitmap文件中的1bit,0表示这一簇未被占用,1表示被占用。如果是文件在$MFT记录中的数据属性为非常驻属性,文件所占用的每一簇在$Bitmap文件中对应的bit置1。
  5. 文件数据实际占用的簇。一般来说稍微大一点的文件,都很可能会形成多个碎片,但这个问题是删除文件,无需考虑碎片的情况,这个后面会提到。


根据第1项的说明,如果文件夹数据/文件大小很小的话,上面4、5两项是没有的。如果是簇大小为4K的NTFS分区,80G的文件在$bitmap中占用80×1024×1024÷4=20Mbit=2.5MB。如果考虑到这些簇可能散乱分布在整个分区中的不同位置,需要把整个$Bitmap文件更新一遍的话,一个1TB的分区的$Bitmap文件是32MB。


所以,每删除一个文件/文件夹,都要更新1~4项的信息。第5项无需更新,文件所使用的簇在$Bitmap中对应的位置0后,将来如果这些簇用来保存新的文件数据会直接覆盖。当然,如果是使用固态硬盘的话,Windows会发送trim指令给固态的主控,主控会在空闲的时候根据磨损算法回收对应的Page。


如果是机械硬盘的话,在没有缓存的前提下,单是找到1~3项的记录通常就需要十多次寻道。每一处记录的更新必然有一次寻道,但对于固态来说只要文件数量不是太多,这个寻道(固态其实应该叫寻址更合适点)时间都可以在1秒内完成。而每一处信息更新通常只需要写入1簇(4K)的数据,就算是机械硬盘,这个数据传输时间也是基本可以忽略的,固态就更不用说了。


最后,根据前面的论述,如果一个游戏有1024个文件的话,写入数据量是1024×12KB=12MB,加上$Bitmap文件的2.5~32MB,总计是14.5MB~44MB。SATA固态硬盘通常4K随机读性能在20MB/s以上,4K写性能100MB/s以上,在这些数据都在缓存中的前提下,还是可以在1秒内完成的。如果文件数量更少,就更加没有压力了。


某些回答里面猜测的这些索引记录是否会在Steam安装游戏的时候使用预分配空间是使得这些记录集中在一起,我可以肯定不是。下图中灰色底色的行是我电脑上的Steam里面泰坦之旅这个游戏的文件夹以及文件夹下若干个文件的起始簇编号、扇区地址:

可以看到,这几个文件/文件夹不管是$MFT记录号还是簇编号,都并不连续。另外,这个游戏的文件加上目录数量不超过600。


Steam能做的,估计是把这些记录所在的扇区缓存到内存中,减少读取数据的寻道/寻址次数。毕竟前面的计算已经足以说明,就算几个游戏加起来如果有一千个文件,这些数据加起来也就12MB,一万个也就120MB(不算$Bitmap),对于今天的主流配置来说这点内存占用完全可以忽略。而不管是删除游戏还是我们平时打开游戏来玩,就不需要从硬盘中读取这些数据了。


最后,关于NTFS分区上如何找到一个文件的$MFT记录号、上级文件夹的索引数据,有兴趣的朋友可以看看我前几天写的文章:


user avatar   bei-ji-85 网友的相关建议: 
      

扫了一眼目前的回答,觉得都没说的很正确。

有几个答案有明显的错误:

1. 拿FAT做举例的,首先NTFS不是FAT,其次,你真算过要是拿FAT32/exFAT存储80G数据,删数据时需要做的清理工作有多大吗?

2. 有人提到固实数据或者NTFS预分配,需要提醒的是Windows Native API里是没有删非空目录的API的,文件系统也不允许,不相信的可以翻MSDN找。或者去看看WDK里的FAT源码,都是开源的,看看文件系统层面上到底支持不支持删目录下的全部文件。或者哪怕看看ReactOS里,也有NTFS的实现,这个可以跟Windows兼容的。

然后说说我的看法:

首先题主给的信息很少,只说了个80G,但没提供更多的信息:

1. 在什么条件下删除的?刚刚下载完?刚刚玩完?还是刚启动steam?这会影响缓存。
2. 这个游戏有多少个文件?文件数量是影响删除效率的关键。
3. 电脑的配置怎样?SSD还是NvME?内存多大?

影响文件系统删除性能的指标有:

1. 文件大小;
2. 文件数量;
3. 缓存;
4. 设备速度。

Steam删的快,要么就是上面的几个指标比较合理,要么就是后台删除,包括另外起一个线程、进程删除、移动到回收站等等。

删除的原理我不细说了,别的答案里有,就是删除索引加上回收数据块,并非真的把80G的数据清零。

那么用数字来说话,看看理论上删除80G到底需要波及多大的数据量:

1. 文件大小。

NTFS采用bitmap方式索引空闲块,删除文件可以不更新其它内容,但这个bitmap是必然要更新的,这个bitmap有多大呢,可以算出来,通常情况下SSD至少是4K块,80G/4K/8=2.5M,也就是说,如果单删一个80G的大文件,需要更新至少2.5M的数据,如果题主用的是SSD的话,确实可以秒删。更重要的一点是,正常使用的情况下,这80G在bitmap上大概率是连续的,所以不会有太多的不连续IO请求。同时,如果块大小比4K大的话,效率还会更高一些。16K块对应的bitmap只有几百KB,已经很小了。

这里提一句FAT了,有人拿FAT做举例,但是没想过FAT作为例子是否合适,如果是FAT32上,还是以4K大小作为分配单元,那么80G需要80G/4K*4=80M的FAT链表,说实话,一秒钟写80M,比起2.5M的NTFS Bitmap来说,多了不少,要一秒钟写完还是有点难度的(因为还有软件开销),况且这还仅仅只是FAT链上的信息,其它的还没算呢。

2. 文件个数。

对于NTFS来说,一个文件在$MFT上占几百个字节,具体数量要看文件的属性,最少好像是64字节左右,但实际上好像没见过有这么小的记录,通常应该是在512字节上下,这里,少算点,按256字节计算。

如果80G的游戏都是大文件,1000个文件就需要:256*1000,大概是256K的样子,不多。

但如果都是小文件,比如平均一个文件1M,那么就是80000个文件,至少需要20M的写入量,这数据量就很恐怖了。

我手上的一个Linux 3.16源码,1.25G左右,接近5万个文件,都是小文件,在SSD上删除,差不多要半分钟。

同时,还有一个更重要的问题,对于文件来说,它跟bitmap还是不一样的,文件在$MFT上不一定连续分布,连续写入20M数据和写入4K*5120次分散的数据,效率是完全不同的,跑过硬盘性能测试的都知道:4K性能通常都比持续读写性能要低的多。

所以,如果游戏是几百个文件,秒删很正常,如果几千上万,那么秒删的难度就很大了。

3. 缓存

缓存的概念比较复杂,前面已经计算出来了,更新bitmap可能是2M多,更新$MFT在几K到几十M之间,但要更新这些数据,首先要读取对应的数据到内存。

如果是刚开机,刚打开steam,那么这些数据大概率是没有完全被缓存的,也就是说,要删除这些数据,首先需要读取一定量的数据,这个数量可能很大。

而如果题主是删除一个刚下载完的游戏,那么这些数据大概率是被缓存在内存里,读取的动作就不需要了,会节约很多时间。

同时,在文件系统、设备驱动、存储设备上都有缓存,如果此时设备比较空闲,或者数据刚刚被访问过,那么前面算出的几M的数据几乎都会被缓存命中,那么性能上会好很多,甚至极端情况下,都不需要访问磁盘。

有一些答案里提到了Steam提前“知道”要删除哪些文件,这里所谓的知道,就是指的缓存,但缓存最多解决了读的问题,数据更新的写的部分是不可缺少的,提前“知道”最多节约一半的时间(多数情况下一半都不到),最耗时的写的动作的时间省不下来。

4. 设备速度

这个没什么可说的,NvME > SSD > HDD,细分一下,就是多考虑一下4K性能或者IOPS指标,对于NvME或者SSD来说,还有Trim/Discard的问题,理论上说,还可能更快。不同设备的IOPS不太一样,我没用过NvME,但贵的SSD和便宜的SSD差别就在IOPS指标上。

-----------------------

对于题主遇到的情况,如果是数量较少的大文件,那么秒删是很正常的,因为本身波及的数据量不大,如果是比较多的文件(几千个),并且还是在SSD甚至HDD上,那么可以认为Steam必然是用了后台删除的功能。


user avatar   delete-NULL 网友的相关建议: 
      

许多类似的游戏,总希望用种种的道德悖论让大家对统治者产生一种错觉:原来剥削我24小时工作都是迫不得已,原来让我的孩子去冒险工作是迫不得已,原来他派我们去送死是在下一盘大棋………

然而事实真的是这样吗?

感谢寒霜朋克,感谢11bit,让我们在这个游戏中明白了,其实没有什么大棋,

小人们被冻死,被饿死,被抛弃,绝望的呼喊,愤怒的抱怨,甚至怒而破坏、叛乱,

都只是因为你菜!

原来,我们本可以让我们的人民,有饭吃,不受冻,勇于探索,积极乐观,活的,像个人一样。

我们本可以做到,我们本就应该做到。

领导者们,本就应该做到。






  

相关话题

  为什么DND在中国无法流行? 
  你觉得游戏《明日方舟》中颜值最高的角色是哪个? 
  《荒野之息》依盖队影响主线探索吗? 
  如何评价免费乙女游戏《猫郎乐园 - Catboys Paradise》 ? 
  你玩「英雄联盟」游戏时会遵守哪些潜规则? 
  如何评价游戏「五月茉莉」? 
  如果将《英雄联盟》拍成电影,建议哪些演员出演对应的英雄? 
  为什么有的人生活中彬彬有礼,在游戏中却经常破口大骂? 
  玩了《原神》多长时间后,你开始觉得这个游戏无聊的? 
  如何看待音乐人陈致逸呼吁玩家不要去听《原神》稻妻因拆包而泄露的音乐内容?这一泄漏有多大影响? 

前一个讨论
联发科能否依靠 5G 旗舰芯片「天玑 1000」在 5G 时代翻身?
下一个讨论
如何看待欧洲 2019Q3 智能手机市场报告:小米暴增 73%,华为增长停滞?反映了哪些信息?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利