使用大文件(> 10GB)

时间:2017-03-06 20:10:43

标签: java

我正在谷歌搜索并没有找到答案。 所以我有一个巨大的文件(> 10GB),我不能存储在内存中。单词用“|”分隔。我需要找到前100000个最常用的短语。

所以我将使用InputStream逐行读取此文件,因此我只需要1行内存。然后我打算将行解析为短语。

但是如何存储短语?我想用这个文件(格式:@ Phrase @@ Count @)。 文件结构可以是这样的:

  

短语|计数
  “Phrase1”17
  “Phrase2”5
  “Phrase3”6

每次我得到短语我在文件中找到它,如果没有这样的短语,我把它放到文件的末尾并将count设置为1.否则我增加这个短语的计数。

有可能吗?我的意思是写入文件中的某个位置?如果是这样我怎么能这样做?也许有一些libs?还是其他任何建议?

2 个答案:

答案 0 :(得分:2)

由于您的目标是找到相同的值,因此排序所有短语都会有效,但由于您没有足够的内存来同时存储所有数据,因此基于磁盘的合并排序可能是您的最佳选择。

在维基百科上,它被称为External merge sort

  

外部排序的一个示例是外部合并排序算法,该算法对每个适合RAM的块进行排序,然后将排序后的块合并在一起。例如,仅使用100兆字节的RAM来分类900兆字节的数据。

答案 1 :(得分:0)

不要随意写入文件,而是应该保留具有键值对的数据结构,其中键是短语,值是它出现的次数。然后,一旦您完整地读完了输入文件,并且所有内容都被计算并正确存储在您的数据结构中,那么您应该使用自己的自我约束将数据结构的内容输出到文本文件中。