内存映射文件位置

时间:2017-08-08 08:23:53

标签: java android memory android-assets

我正在尝试搜索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(没有这样的文件或目录)"错误信息。感谢您的任何提示!

1 个答案:

答案 0 :(得分:0)

使用内存映射文件在这里是一个坏主意。你本质上是在浪费操作系统资源,无论如何它都不会让你获得最佳速度。

如果您只是偶尔执行一次搜索,您希望保持简单,并且不希望在搜索之间将文件保留在内存中,请使用BufferedInputStream。给它一个缓冲区,比如1​​0 kB,它应该执行得非常快,而且很可能你会使磁盘饱和。

如果您要执行大量搜索,请尝试在搜索之间将内容保留在内存中。使用HashSet或TreeSet。如果你正在使用HashSet,请给它足够的桶来开始。

如果这些都不适合你(即你内存不足,你有数百万个单词,仍然想要快速搜索),将单词转换为某个SQL数据库,将数据放入表中并对其进行索引。这确实是数据库擅长的。您应该可以轻松找到适合您目的的数据库。

显然,300k字不是很多,它应该很容易适应内存,大约10 MB左右。根据您的使用情况,您可能还需要查看Bloom filter