我正在尝试搜索 268 000 个单词的列表。这个想法是检查用户输入的单词是否存在于该列表中。我已经使用简单的 I/O 流完成了这项工作,但是搜索需要大约 5 秒,这太长了。我的文件目前位于资产中。我一直在寻找更有效的方法来搜索我的文件,我遇到了内存映射缓冲区。但是,在以下示例中,我不清楚应该将文件存储在哪里:
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:打开失败:ENOENT(没有这样的文件或目录)”错误消息。感谢您提供任何提示!
在这里使用内存映射文件是个坏主意。您实际上是在浪费操作系统资源,无论如何它都不会为您提供最佳速度。
如果您只是偶尔执行一次搜索,您想保持简单并且不想在搜索之间将文件保留在内存中,请使用 BufferedInputStream。给它一个缓冲区,比如 10 kB,它应该执行得非常快,而且很可能会使磁盘饱和。
如果您要执行大量搜索,请尝试在两次搜索之间将内容保留在内存中。使用 HashSet 或 TreeSet。如果您正在使用 HashSet,请为其提供足够的存储桶。
如果这些都不适合您(即您的内存不足,您有数百万个单词并且仍然需要快速搜索),请将这些单词转换为某个 SQL 数据库,将数据放入一个表中并对其进行索引。这正是数据库所擅长的。您应该可以轻松找到适合您目的的数据库。
显然,300k 字并不多,它应该很容易放入内存中,大约 10 MB。根据您的使用场景,您可能还想查看Bloom filter。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句