我有一个基于Spring的Java webapp。我的问题是:
我有一个34MB的文件,有270万行。线条只是一个接一个的单词:
abc
abcdfg
xyz
etc
我需要从这个文件中选择15个随机的唯一行,这些行不是很快就能。我知道要搜索这么大的文件,我可以使用Apache Lucene。你知道Lucene能否为我提供这些随机线条。或者也许你有其他想法可以帮助我解决这个问题。
我真的很感激任何帮助
提前致谢
编辑:
或者只是把这个文件放到数据库[PostgreSQL]中?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
我建议使用Mongo DB(它不像RMDBS那样可靠,但速度非常快)。
http://www.mongodb.org/display/DOCS/Quickstart 我会将文本文件解析为Mongo文档,然后从Mongo db中检索随机3个文档,这将导致3个随机短语。
1)在Java中读取文本文件并将每行保存为mongo中的单独文档,或执行类似命令 在mongo直接
> doc = { phrase : 'uniquephrase'}
> db.posts.insert(doc);
2)在你的java连接到mongo,获取集合大小并从中随机选择3个数字,然后提供3个文档......(或其他任何东西)