1
8
我相信您可以通过首先检查文件大小来存档最显著的性能改进,如果文件大小不匹配,您可以跳过整个文件,甚至不打开它。 除了保存已知哈希列表之外,您还将保留已知文件大小的列表,并且只在文件大小匹配时进行内容比较。当文件大小不匹配时,即使查看文件内容,也可以保存自己。 根据文件的一般大小,进一步的改进是值得的:
我怀疑改变散列算法本身(如建议进行CRC的第一次检查)会产生任何显著的差异。您的瓶颈很可能是磁盘IO,而不是CPU,因此避免磁盘IO将给您带来最大的改进。但和往常一样, 做 措施。 然后,如果这还不够(只有在那时),可以尝试使用异步IO(请记住,尽管顺序读取通常比随机访问快,但是过多的随机异步读取可能会损害您的性能) |
2
1
|
3
1
|
4
0
我会先做一个快速的CRC哈希检查,因为它比较便宜。 如果CRC不匹配,则继续执行更“可靠”的哈希测试,如sha |
5
0
你对问题的描述仍然不够清楚。 最大的问题是你在做一些散列。这肯定很慢。 您可能希望尝试搜索修改时间,如果文件名发生更改,则修改时间不会更改: http://msdn.microsoft.com/en-us/library/ms724320(VS.85,loband).aspx 或者您可能希望监视文件夹中是否有任何新文件更改: |
6
0
首先按文件大小对文件进行分组-这将使您拥有较小的文件组。现在它取决于组大小和文件大小。您可以开始并行读取所有文件,直到找到不同之处。如果存在差异,则将组拆分为在当前位置具有相同值的较小组。如果您有关于文件差异的信息,那么您可以使用这些信息—从末尾开始读取,如果集群发生较大的变化,则不要逐字节读取和比较,或者了解文件的内容。如果必须并行读取许多文件导致随机磁盘访问,此解决方案可能会引入I/O性能问题。 您还可以计算每个组中所有文件的哈希值并进行比较。您不必一次处理整个文件—只需计算几个字节(可能是4kib集群或任何适合您文件大小的字节)的散列值,并检查是否存在所有就绪的差异。如果没有,计算接下来几个字节的哈希值。这将使您能够处理每个文件的较大块,而无需为内存中一组中的每个文件保留一个这样大的块。 所以这一切都是关于时间内存(磁盘I/O内存)的权衡。您必须找到将组中的所有文件读取到内存中并逐字节比较它们(高内存需求、快速顺序访问,但可能读取大量数据)和逐字节读取文件并仅比较最后一个字节读取(低内存需求、缓慢随机访问、只读取所需数据)的方法。此外,如果组非常大,则逐字节比较文件将变慢-从n个文件中比较一个字节是一个O(N)操作-首先计算哈希值,然后仅比较哈希值可能会变得更高效。 |
7
0
更新: 绝对不要只检查文件大小。如果您的操作系统版本允许使用fileinfo.lastwritetime 我为内部项目编译器/打包程序实现了类似的功能。我们有超过8K个文件,所以我们将最后修改的日期和哈希数据存储到SQL数据库中。然后在随后的运行中,我们首先查询任何特定文件上的修改日期,然后只查询哈希数据…这样我们只计算那些看起来被修改的文件的新哈希数据… .NET可以在fileinfo类中检查上次修改的日期。我建议你去看看。 编辑: 这是链接 LastWriteTime 我们的打包程序需要大约20秒来找出哪些文件被修改过。 |
Robert King · Unity C#语法问题-转换位置 1 年前 |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
i_sniff_ket · 在unity之外使用unity类 2 年前 |