【问题标题】:Which is faster - comparing binary data or line-wise strings?哪个更快 - 比较二进制数据或逐行字符串?
【发布时间】:2014-07-13 10:28:16
【问题描述】:

问题

我在这里描述了我的问题的一个非常简化的版本。我有一个巨大的文件(10-50GB),我需要分成数百万个块。假设我有某些包含字符串“SPLITTER”的行。我需要按这些行拆分文件。每个块将包含两个 SPLITTER 行之间的文本。

这当然非常简单,实际用例会涉及更复杂的匹配/拆分。

问题

所以我们这里有一个流匹配问题。哪个更有效:将其视为字符串匹配问题,使用缓冲读取器读取行并根据该问题进行比较和拆分? - 或 - 将文件视为二进制输入流,将拆分器字符串视为 Array[Byte] 并进行逐字节比较?

在开始实施某事之前,我需要先了解一下。

我正在使用 Java。此外,原始输入将即时从 bz2 解压缩,这是物有所值的。

【问题讨论】:

  • 你把文件当作一堆字符串吗?任意二进制数据通常不会使Strings 有效,尽管我不知道 Java 是否强制执行此操作。
  • @delnan 这就是我的观点。将文件视为一堆字符串在技术上意味着类似 new BufferedReader(new InputStreamReader(someBinaryInputStream)) - 并使用此 Reader 执行我的匹配拆分内容。这不会产生额外的开销吗?由于文件有几十GB,而我的匹配字符串可能只有几十个字符,将它们转换为字节并直接进行字节匹配应该更快?
  • 但这不是 我的 点。当你有一堆bytes 时,将它们解释为String(或char[])通常是不正确的。根据您的操作方式,您可能会破坏二进制数据、遗漏 SPLITTER 行、生成无效字符串并在字符串处理中导致不知道是什么错误或其他一些废话。无论你的“分割线”之间是什么,如果它真的是二进制数据,你无论如何都不能用它制作一个字符串,所以问题没有实际意义
  • 我明白你现在的意思了,我同意。但我必须提到我的特定用例实际上处理的是字符串数据。我只是在 Java 中解压缩压缩的 bz2 并将其作为二进制流获取。
  • 在您根据SPLITTER 拆分的流中,这些字符串仍然是bz2 二进制数据,还是已经解压缩?在前一种情况下(拆分 bz2 流),没有任何变化:两者之间的数据现在是二进制的,即使它稍后转换为适当的字符串。

标签: java string performance binary-data string-matching


【解决方案1】:

将数据视为原始字节总是会更快。将数据作为字符串获取意味着将其作为字节读取,然后创建新的字符串。

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2016-06-22
    • 2011-08-15
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多