0

我有一个基于 Spring 的 Java webapp。我的问题是:

我有一个 34MB 和 270 万行的文件。行只是一个接一个的单词:

abc
abcdfg
xyz
etc

我需要从这个文件中选择 15 个随机的唯一行,这些行并不以非常快的方式彼此相邻。我知道要搜索这么大的文件,我可以使用 Apache Lucene。你知道 Lucene 能不能帮我弄到这些随机线。或者,也许您有其他想法可以帮助我解决这个问题。

我真的很感激任何帮助

提前致谢

编辑:

或者也许只是把这个文件放入数据库[PostgreSQL]?

4

2 回答 2

1

Lucene 不适合你。

相反,只需生成随机数(确保它们不相邻),然后从文本文件中读取这些行。

这是执行此操作的代码:

  public static void main(String[] args) throws IOException
  {
    BufferedReader reader = new BufferedReader(new FileReader(
        "MyFile.txt"));
    try
    {
      final int MAX_NUM = <ENTER-YOUR-MAX-NUMBER-OF-LINES>;
      Set<Integer> randomLines = new HashSet<Integer>();
      Random rnd = new Random(System.currentTimeMillis());
      for (int i = 0; i < 15; i++)
      {
        int aNum = rnd.nextInt(MAX_NUM);
        // to make sure no lines next to each other...
        if (!randomLines.contains(aNum) && !randomLines.contains(aNum+1) && !randomLines.contains(aNum-1))
        {
          randomLines.add(aNum);
        }
      }
      List<String> result = new ArrayList<String>();
      String aLine;
      int lineNo = 0;
      while ((aLine = reader.readLine()) != null)
      {
        if (randomLines.contains(lineNo))
        {
          result.add(aLine);
        }
        lineNo++;
      }
      System.out.println("Result: " + result);
    }
    finally
    {
      reader.close();
    }
  }
于 2012-10-24T13:43:14.730 回答
0

我建议使用 Mongo DB(它不如 RMDBS 可靠,但速度极快)。

http://www.mongodb.org/display/DOCS/Quickstart 我会将文本文件解析为 Mongo 文档,然后从 Mongo db 中检索随机 3 个文档,这将产生 3 个随机短语。

1)在Java中读取文本文件并在mongo中将每一行保存为单独的doc,或者像在mongo中直接执行命令

> doc = { phrase : 'uniquephrase'}
> db.posts.insert(doc); 

2)在你的java中连接到mongo,获取集合大小并从中选择随机3个数字,然后提供3个文档......(或其他任何东西)

于 2012-10-26T20:49:46.350 回答