【发布时间】: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 倍。
- 正常吗?
- 有什么方法可以读取文本文件同时避免如此大的分配(可能是不安全的代码?)?
注意: 要点是,在读取文件时,分配比文件大小大 x 倍是否正常。我知道逐行阅读会让 GC 从之前的 ReadLine 收集垃圾。这似乎不正常,而且由于目标设备是旧的 android 手机,我担心解析 50MB 文件是否实际上不会导致应用程序崩溃。我的问题 2 的意思是如何最小化分配,而不是如何拆分这些分配。
【问题讨论】:
-
您必须使用 FileStream 流式传输它才能逐行读取。
-
File.ReadAllLines呢? -
您真的关心知识库吗?你用的是什么设备?另外,您为什么不使用
File.ReadLines,它不需要在开始处理之前将整个文件加载到内存中,并且还可以为您拆分行。 -
如果文件较大,请查看
File.ReadLines()并逐行处理文件 -
当然你会在每一行上拆分,但由于并非所有行都同时在内存中管理,所以它不应该使用更多的内存。分配,当然,但它不会一次全部占用内存 AFAIK。
标签: c# string parsing io split