我正在尝试搜索268 000个单词的列表。我们的想法是检查用户输入的单词是否存在于该列表中。我使用一个简单的I / O流完成了这个,但搜索大约需要5秒,这太长了。我的文件目前位于Assets。我一直在寻找更有效的方法来搜索我的文件,而且我遇到了Memory Mapped Buffer。但是,我不清楚我应该在以下示例中存储我的文件:
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFiles {
private static String largeFile = "sowpods.txt";
public static void read() throws IOException {
File file = new File(largeFile);
FileChannel fileChannel = new
RandomAccessFile(file,"r").getChannel();
MappedByteBuffer buffer = fileChannel.map(
FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
System.out.println(buffer.isLoaded());
System.out.println(buffer.capacity());
}
}
如果我将其留在资产中,我该如何阅读?目前,我正在收到一个" sowpods.txt:open failed:ENOENT(没有这样的文件或目录)"错误信息。感谢您的任何提示!
答案 0 :(得分:0)
使用内存映射文件在这里是一个坏主意。你本质上是在浪费操作系统资源,无论如何它都不会让你获得最佳速度。
如果您只是偶尔执行一次搜索,您希望保持简单,并且不希望在搜索之间将文件保留在内存中,请使用BufferedInputStream。给它一个缓冲区,比如10 kB,它应该执行得非常快,而且很可能你会使磁盘饱和。
如果您要执行大量搜索,请尝试在搜索之间将内容保留在内存中。使用HashSet或TreeSet。如果你正在使用HashSet,请给它足够的桶来开始。
如果这些都不适合你(即你内存不足,你有数百万个单词,仍然想要快速搜索),将单词转换为某个SQL数据库,将数据放入表中并对其进行索引。这确实是数据库擅长的。您应该可以轻松找到适合您目的的数据库。
显然,300k字不是很多,它应该很容易适应内存,大约10 MB左右。根据您的使用情况,您可能还需要查看Bloom filter。