2012-10-24 31 views
0

我有一个基于Spring的Java Web应用程序。而我的问题是:从Lucene的非常大的文件中获取随机行

我有一个文件有34MB,有270万行。行只是一个字一个接一个:

abc 
abcdfg 
xyz 
etc 

我需要选择从该文件15条随机独特的线,是不是在一个相当快的方式彼此相邻。我知道要搜索这么大的文件,我可以使用Apache Lucene。你知道Lucene是否可以为我提供这些随机线路。或者,也许你有其他的想法可以帮助我解决这个问题。

我真的很感谢所有帮助提前

感谢

编辑:

或者,也许只是把这个文件到数据库[PostgreSQL的]?

+3

如果它不一定是完美的,你可以寻找文件中的随机位置,直到下一个开始 - 行(如果到达结尾,则回卷到开头),然后返回下一行。随着时间的推移,这将会在更长的线路之后积累对线路的偏见。你可以通过用空格填充所有行到相同的长度来纠正这种偏见。 – Wug

+2

如果你想随机选择一些行,那么Lucene不能帮你,因为它是一个全文索引/搜索库(http://en.wikipedia.org/wiki/Lucene)。 – Vikdor

+0

对不起,也许你误解了我,我需要15个不相邻的唯一行 –

回答

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(); 
    } 
    } 
+0

它是有效的方式?如果200个用户同时这样做,情况如何?虽然循环会遍历文件的每一行到指定的行,如果它将是260万行,然后200名用户会做同样的事情我的web应用程序可能会很快失去内存? –

+0

是的没有那么高效。你也可以做的是计算每条新线的前期偏移量。例如第10行从第100个字节开始,第11行从第105个字节开始等等...然后当用户想要得到15个随机行而不是迭代文件时,只需查找所需行号的偏移量并直接从文件中获取行。例如RandomAccessFile reader = new RandomAccessFile(“aaaa.txt”,“r”); reader.seek(offset-of-the-line-line); reader.seek reader.readLine(); – user1697575

0

我会建议使用蒙戈DB(它并不像RMDBS可靠,但它是extremally快)。

http://www.mongodb.org/display/DOCS/Quickstart 我会解析文本文件到Mongo文件,然后从Mongo数据库中检索随机3文件,这将导致3个随机短语。

1)在Java中读取文本文件,并保存每一行作为蒙戈单独的文档,或者在你的java蒙戈直接

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

2)执行类似 命令连接到蒙戈,得到集合的大小和从随机选择3个数字,然后提供3个文档...(或其他任何东西)

相关问题