【问题标题】:C# Parsing text file overheadC#解析文本文件开销
【发布时间】:2015-12-03 12:07:38
【问题描述】:

我正在尝试将一个非常简单的文本文件解析为一些结构。为此,我需要在每个新行和每个空格上拆分整个文本。代码非常简单:

string   path       = "C:/file.ext";
string   fileString = File.ReadAllText (path);
string[] splitFile  = fileString.Split (' ', '\n', '/');

在分析上述代码(使用内置游戏引擎分析器)后,我注意到在解析一个 40KB 的文件时,File.ReadAllText 分配了 280KB 内存,字符串的 Split 分配了 310KB,总和几乎是文件大小的 15 倍。

  1. 正常吗?
  2. 有什么方法可以读取文本文件同时避免如此大的分配(可能是不安全的代码?)?

注意: 要点是,在读取文件时,分配比文件大小大 x 倍是否正常。我知道逐行阅读会让 GC 从之前的 ReadLine 收集垃圾。这似乎不正常,而且由于目标设备是旧的 android 手机,我担心解析 50MB 文件是否实际上不会导致应用程序崩溃。我的问题 2 的意思是如何最小化分配,而不是如何拆分这些分配。

【问题讨论】:

  • 您必须使用 FileStream 流式传输它才能逐行读取。
  • File.ReadAllLines 呢?
  • 您真的关心知识库吗?你用的是什么设备?另外,您为什么不使用File.ReadLines,它不需要在开始处理之前将整个文件加载到内存中,并且还可以为您拆分行。
  • 如果文件较大,请查看File.ReadLines()逐行处理文件
  • 当然你会在每一行上拆分,但由于并非所有行都同时在内存中管理,所以它不应该使用更多的内存。分配,当然,但它不会一次全部占用内存 AFAIK。

标签: c# string parsing io split


【解决方案1】:

我没有足够的声誉来评论上述帖子,但您是否尝试过使用二进制读取器类以二进制形式读取文件,然后一次读取 8 个字节?

【讨论】:

  • 我没有,但是,这听起来像是拆分这些分配的解决方案。如果是这样,请阅读我问题底部的已编辑注释。我可能用第二个问题误导了人们——我在想的是如何最小化分配,而不是如何拆分它们。如果我理解错了,请纠正我。
猜你喜欢
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多