我有一个非常大的字符串,当我用Java读取它时,我的内存出错了。实际上,我需要将所有这些字符串读入内存,然后分成单独的字符串并根据值对它们进行排序。这样做的最佳方式是什么?
由于
答案 0 :(得分:4)
你的大字符串来自哪里?正如你所说,你读它,我认为它来自一个文件。你必须知道整个字符串知道在哪里拆分吗?如果没有,你可以通过char读取文件char,直到你点击一个拆分标记,将所有字符读取到目前为止在字符串中并开始读取下一个字符串。您是否大致知道在哪里对您刚读过的单个字符串进行排序?如果是这样,您可以将部分字符串写入单独的文件(例如,在按字母顺序对字符串进行排序时,所有以A开头的字符串将转到A.tmp)。之后,您可以对(创建的文件内容)进行排序(希望现在足够小以适应您的内存)并最终将内容附加到新的输出文件中。
答案 1 :(得分:2)
如果您受内存限制,那么您可以尝试应用合并排序,否则使用虚拟机参数增加堆大小-Xmx和-Xms
答案 2 :(得分:1)
如果您希望Hadoop“逐行”处理100 GiB apache日志文件,那么您基本上可以按照自己的意愿进行操作:将大量文本拆分为多个部分。
在Hadoop中执行此操作的正常方法(正如您使用此标记问题)使用TextInputFormat使用LineRecordReader,LineReader使用See the Hadoop example拆分文本文件行尾“分隔符。你想要的是基本相同的一个区别:分裂不同的东西。
对结果值进行排序(在Hadoop中)主要通过使用所谓的“二级排序”(the explanation in Tom's book和TextInputFormat)来完成。
所以我建议做的是
HTH
答案 3 :(得分:0)
你可以看一下 External sorting algoritmhs