【问题标题】:Fastest way to initialize List<string> with data from file [duplicate]使用文件中的数据初始化 List<string> 的最快方法 [重复]
【发布时间】:2017-11-29 09:43:28
【问题描述】:

我正在尝试使用文件中的一些数据初始化List&lt;string&gt;。该文件是一个由回车分隔的单词列表,所以目前,我正在做

var wordList = new List<string>(textFromFile.Split( new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None ) )

但是对于我正在处理的文本文件的大小(其中一个文件中有 172,888 行!),这非常慢。有一个更好的方法吗?文本文件不必按照当前的方式进行格式化,如果有更好的数据存储方法,我可以解析它并以不同的格式写出来。在 C++ 中,我会考虑二进制数据和 memcopy,但我认为 C# 中没有类似的解决方案?

如果相关,代码位于 Unity 应用程序中,因此仅限于 Mono 版本的早期 .NET 功能

【问题讨论】:

  • 好吧,你没有展示你是如何阅读文件的。您的代码仅拆分了整个字符串,没有提及您如何获得该字符串。
  • 您可能想使用File.ReadAllLines 方法,因为它完全符合您的要求
  • 一件事 - 如果您可以控制文件的写入方式,为什么不直接使用 \n 分隔符进行标准化,那么您只需拆分一个字符?
  • 有多慢?文件有多大?你需要它有多慢(并且尽可能快不是一个有效的答案)?
  • 请注意,如果你真的不需要它是List(即 - 不需要在那里添加\删除项目) - 然后只需执行 ReadAllLines 并使用该数组,因为从数组构造列表会复制所有的东西,这是不必要的。

标签: c# parsing unity3d


【解决方案1】:

您可能想使用File.ReadAllLines 来读取文件,它完全符合您的要求,而且它应该得到很好的优化。

var wordList = File.ReadAllLines("yourFileSrc");

为了进一步提高性能,您可能希望将文件拆分为 N 个文件并使用 TPL(任务并行库)或使用 .AsParallel 方法(如 Evk 建议)并行处理它们

更多关于 PLINQ 的信息你可以找到here

***更新

为了解析一个大字符串,您可能希望先将字符串(不解析它)拆分为多个较小的字符串,然后并行处理它们。

【讨论】:

  • 即使不拆分文件,您也可以并行处理它们,例如File.ReadLines(file).AsParallel()(取决于在这种情况下“进程”的确切含义)。
  • 是的,谢谢,更新了。
  • 我不确定是否可以在 Unity 中使用 TPL 的东西。在我们针对的某些平台上,它不支持线程。 (抱歉,原问题中没有提到 Unity)
猜你喜欢
  • 2012-05-30
  • 2022-01-13
  • 1970-01-01
  • 2013-12-12
  • 2014-02-11
  • 2015-03-16
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多