【问题标题】:Fastest reading binary file reading and writing最快读取二进制文件读写
【发布时间】:2012-05-01 14:59:24
【问题描述】:

我正在编写一个应用程序来读取和解析大小可能为 1 KB 到 200 MB 的文件。

我要解析两次...

  1. 提取文件中包含的图像。

  2. 解析该图像以提取图像的内容。

我一般使用文件流、缓冲流、二进制读取器和二进制写入器来读写内容。

现在,我想知道读取文件和提取内容的最快和最有效的方法...

有没有好的方法或者好的类库?

注意:不安全的代码是可以的!

【问题讨论】:

  • 这里最大的性能改进将通过一次解析文件获得。这样可以避免您扫描图像两次
  • @Luke 实际上图像包含在块中,并且图像中的一些字节应该在解析之前删除[记录]。
  • 是的,就使用 .NET 文件对象而言,就读取文件的原始速度而言,性能差异应该不大。您是否出于某种原因希望对其进行优化?
  • 文件读取和写入需要很长时间...一个 81 mb 的文件大约需要 >30-40 秒来读取和提取...所以,我决定对其进行优化,以便文件以更快的方式提取。
  • 如果从 80 MB 文件中提取数据需要 40 秒,则文件 I/O 速度不太可能是问题。一些显示您正在做什么的示例代码将非常有帮助。您可以考虑将整个文件读入内存,创建一个MemoryStream,然后将您的BinaryReader 连接到它。然后,您可以分析您的代码并准确查看瓶颈所在。

标签: c# file parsing


【解决方案1】:

读取文件最快最简单的方法就是:

var file = File.ReadAllBytes(fileName);

这会将整个文件作为字节数组读入内存。然后,您可以通过它以内存阵列访问速度(也就是说,非常快)寻找您需要的东西。这几乎肯定会比在阅读文件时尝试处理文件要快。

但是,如果此文件不能很好地放入内存(81 MB 可以),那么您需要分块执行此操作。如果不需要,我们可以安全地避免这种棘手的讨论。在这种情况下,解决方案将是:

  1. 如果使用 .NET 4.0,请使用 memory mapped files(更多内容请参见 What are the advantages of memory-mapped files?)。

  2. 如果没有,您将需要分块读取、缓存并保留您认为需要在内存中的内容(为了提高效率),或者重新读取您根本无法将其保存在内存中的内容。这可能会变得混乱和缓慢。

【讨论】:

  • 实际上原始文件包含 HEADER 和 ACHUNK 和 BCHUNK [ACHUNK 和 BCHUNK 是两种类型的块]图像包含在 BCHUNK 中,所以我应该读取这些块......我可能正在使用内存映射文件 [我在开始编写这个 Lib 之前就有使用它的想法] 但我不确定它的可靠性。但现在我可能不得不使用它来提高性能。我没有将其标记为答案,但它确实帮助了我。
  • 好吧,你可以投赞成票。无论如何,您的问题都没有尖叫内存映射文件。 ReadAllBytes 会做你需要的一切,而且它又快又简单。无论如何。
  • 我无法投票,因为我的声望低于 15。我不应该使用ReadAllBytes,因为数组函数比 FileStream 函数慢。
  • 好吧,这完全不是真的(在幕后你认为ReadAllBytes 是如何工作的?),你可以在两者上添加一个阅读器。如果您要读取数据两次,则无论如何都需要在内存中。但一切都说了算,你的电话。
猜你喜欢
  • 2011-01-03
  • 2012-01-26
  • 2018-07-26
  • 2016-06-14
  • 2021-06-03
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多