内存映射文件位置

密码诗人

我正在尝试搜索 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

与&映射的可变内存位置

来自分类Dev

远程文件内存映射

来自分类Dev

Linux内存映射文件

来自分类Dev

MATLAB中的内存映射文件?

来自分类Dev

搜索大内存映射文件

来自分类Dev

MongoDB中的内存映射文件

来自分类Dev

内存映射大文件Haskell

来自分类Dev

内存映射文件的原子操作

来自分类Dev

解析内存映射文件C

来自分类Dev

在Java内存映射大文件

来自分类Dev

链接增强内存映射文件

来自分类Dev

内存映射,我可以将对象与内存位置同步吗?

来自分类Dev

写入内存映射的稀疏文件的漏洞

来自分类Dev

确定文件映射到内存的次数

来自分类Dev

Java-内存映射文件的好处

来自分类Dev

Java NIO-内存映射文件

来自分类Dev

从内存映射文件读取意外值

来自分类Dev

stl向量中的内存映射文件存储

来自分类Dev

Windows中内存映射文件的命名约定

来自分类Dev

PE文件如何映射到内存中?

来自分类Dev

无法写入内存映射文件

来自分类Dev

C / C ++-使用mmap的内存映射文件

来自分类Dev

重载内存映射文件加载器(C ++)

来自分类Dev

在Linux中观察共享的映射文件内存

来自分类Dev

监视页面缓存/内存映射文件的访问

来自分类Dev

cuda-零拷贝内存,内存映射文件

来自分类Dev

释放内存映射文件后取消映射视图安全吗?

来自分类Dev

什么决定了内存重新映射操作后的位置无关性?

来自分类Dev

内存将数组映射到固定位置