gpt4 book ai didi

c# - 解析大字符串的最快方法(多线程)

转载 作者:太空狗 更新时间:2023-10-30 01:10:41 25 4
gpt4 key购买 nike

我即将开始一个项目,该项目将采用文本 block ,将大量数据解析为某种对象,然后可以序列化、存储和收集统计/数据。这需要尽可能快,因为我需要开始处理超过 10,000,000 个文本 block ,并且每天将获得 100,000 个文本 block 。

我在具有 12 个至强内核 + 超线程的系统上运行它。我也可以访问/了解一些关于 CUDA 编程的信息,但对于字符串内容,我认为它不合适。我需要从每个字符串中解析大量数据,其中一些我知道它们的确切位置,一些我不知道并且需要使用正则表达式/一些聪明的东西。

所以考虑这样的事情:

object[] parseAll (string [] stringsToParse)
{
parallel foreach
parse( string[n] )
}

object parse(string s)
{
try to use exact positions / substring etc here instead of regex's
}

所以我的问题是:

  • 使用正则表达式进行子字符串的速度有多慢。
  • .NET 是否会比其他语言慢很多。
  • 我可以做什么样的优化(如果有的话)来最大化并行度。
  • 还有什么我没有考虑的吗?

感谢您的帮助!对不起,如果这是长篇大论。

最佳答案

使用正则表达式来替换字符串要慢多少。
如果你正在寻找一个精确的字符串,substr 会更快。然而,正则表达式是高度优化的。它们(或至少部分)被编译为 IL,您甚至可以使用 Regex.CompileToAssembly 将这些编译版本存储在单独的程序集中。参见 http://msdn.microsoft.com/en-us/library/9ek5zak6.aspx获取更多信息。

您真正需要做的是执行测量。到目前为止,使用 Stopwatch 之类的东西是验证一个或另一个代码构造是否运行得更快的最简单方法。

我可以做什么样的优化(如果有的话)来最大化并行度。
使用 Task.Factory.StartNew,您可以安排任务在线程池上运行。您还可以查看 TPL(任务并行库,Task 是其中的一部分)。它有很多结构可以帮助您并行化工作,并允许像 Parallel.ForEach() 这样的结构在多个线程上执行迭代。参见 http://msdn.microsoft.com/en-us/library/dd460717.aspx获取更多信息。

还有什么我没有考虑到的吗?
内存管理会对您造成如此大的数据量伤害。需要考虑的几件事:

  • 限制内存分配:尝试为单个文档重复使用相同的缓冲区,而不是在只需要一部分时复制它们。假设您需要处理从 char 1000 到 2000 的范围,不要将该范围复制到新的缓冲区中,而是构建您的代码以仅在该范围内工作。这会使您的代码更复杂,但可以节省您的内存分配;

  • StringBuilder 是一个重要的类。如果您还不知道,请看一看。

关于c# - 解析大字符串的最快方法(多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com