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

Luk*_*ina 5 c# regex string parallel-processing parsing

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

我在具有 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
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 使用正则表达式来 substr 慢多少。
  • .NET 会比其他语言慢得多吗?
  • 我可以做什么样的优化(如果有的话)来最大化并行性。
  • 还有什么我没有考虑过的吗?

谢谢你的帮助!对不起,如果这是冗长的。

Pie*_*kel 5

使用正则表达式来 substr 慢多少。
如果您正在寻找一个确切的字符串, substr 会更快。然而,正则表达式是高度优化的。它们(或至少部分)被编译为 IL,您甚至可以使用Regex.CompileToAssembly. 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/9ek5zak6.aspx

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

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

还有什么我没有考虑过的吗?
使用这种数据量会对您造成伤害的一件事是内存管理。需要考虑以下几点:

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

  • StringBuilder是一个重要的类。如果你还不知道,那就来看看吧。