将长字符串读入内存

时间:2010-10-01 04:32:51

标签: java programming-languages hadoop large-files

我有一个非常大的字符串,当我用Java读取它时,我的内存出错了。实际上,我需要将所有这些字符串读入内存,然后分成单独的字符串并根据值对它们进行排序。这样做的最佳方式是什么?

由于

4 个答案:

答案 0 :(得分:4)

你的大字符串来自哪里?正如你所说,你读它,我认为它来自一个文件。你必须知道整个字符串知道在哪里拆分吗?如果没有,你可以通过char读取文件char,直到你点击一个拆分标记,将所有字符读取到目前为止在字符串中并开始读取下一个字符串。您是否大致知道在哪里对您刚读过的单个字符串进行排序?如果是这样,您可以将部分字符串写入单独的文件(例如,在按字母顺序对字符串进行排序时,所有以A开头的字符串将转到A.tmp)。之后,您可以对(创建的文件内容)进行排序(希望现在足够小以适应您的内存)并最终将内容附加到新的输出文件中。

答案 1 :(得分:2)

如果您受内存限制,那么您可以尝试应用合并排序,否则使用虚拟机参数增加堆大小-Xmx和-Xms

答案 2 :(得分:1)

如果您希望Hadoop“逐行”处理100 GiB apache日志文件,那么您基本上可以按照自己的意愿进行操作:将大量文本拆分为多个部分。

在Hadoop中执行此操作的正常方法(正如您使用此标记问题)使用TextInputFormat使用LineRecordReaderLineReader使用See the Hadoop example拆分文本文件行尾“分隔符。你想要的是基本相同的一个区别:分裂不同的东西。

对结果值进行排序(在Hadoop中)主要通过使用所谓的“二级排序”(the explanation in Tom's bookTextInputFormat)来完成。

所以我建议做的是

  1. LineRecordReader / LineReader / {{3}}上创建自己的变体,根据您的分隔符读取和提取字符串的各个部分。
  2. 创建一个重写信息的地图,以进行二级排序。
  3. 创建正确的分区,组和键比较器类/方法以进行排序。
  4. 创建一个reduce,您可以在其中收到可以进一步处理的已排序信息。
  5. HTH

答案 3 :(得分:0)

你可以看一下 External sorting algoritmhs