Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果必须将内存复制到原语以供以后操作,java中的文件内存映射是无用的_Java_Memory Mapped Files_Memory Mapping_Mappedbytebuffer - Fatal编程技术网

如果必须将内存复制到原语以供以后操作,java中的文件内存映射是无用的

如果必须将内存复制到原语以供以后操作,java中的文件内存映射是无用的,java,memory-mapped-files,memory-mapping,mappedbytebuffer,Java,Memory Mapped Files,Memory Mapping,Mappedbytebuffer,我正在使用MappedByteBuffer加载我写入内存的文件。这应该是加载文件的一种快速方法。我的文件包含一堆ints和doubles。网上有很多教程向您展示如何编写和读取文件。这是我的测试: private static int count = (500*4) + (500*8); public static void main(String[] args) throws IOException { //writing two arrays to file int[] a

我正在使用MappedByteBuffer加载我写入内存的文件。这应该是加载文件的一种快速方法。我的文件包含一堆
int
s和
double
s。网上有很多教程向您展示如何编写和读取文件。这是我的测试:

private static int count = (500*4) + (500*8);

public static void main(String[] args) throws IOException {
    //writing two arrays to file
    int[] a = new int[500];
    double [] b = new double[500];

    for (int i = 0; i < a.length; i++){
        a[i] = i;
        b[i] = (double)i;
    }

    RandomAccessFile memoryMappedFile = new RandomAccessFile("f.txt","rw");
    MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);
    for(int i = 0 ; i < a.length; i++) {
        out.putInt(a[i]);
        out.putDouble(b[i]);
    }

    //reading back the ints and doubles
    int c = 0;
    out.position(c);
    while (out.hasRemaining()){
        System.out.println(out.getInt(c));
        c += 4;
        out.position(c);
        System.out.println(out.getDouble(c));
        c += 8;
        out.position(c);

    }
}
私有静态整数计数=(500*4)+(500*8);
公共静态void main(字符串[]args)引发IOException{
//将两个数组写入文件
int[]a=新的int[500];
double[]b=新的double[500];
for(int i=0;i
这一切都很好,但这些教程的问题在于,它们只是将文件的内容打印到控制台。但是,如果我想使用文件的值进行更多的计算,那么稍后,我需要将它们存储到一些变量(或数组)中,本质上是创建它们的新副本,这与内存映射文件的用途背道而驰

唯一的其他解决方法是按需调用
out.position()
,但我需要知道我想要使用的理想值的位置,如果我没有按顺序遍历它们,我认为不可能知道

在c/c++中,您可以创建一个int变量,该变量将指向内存映射的int,这样您就不会复制该值,但在Java中,这是不可能的

因此,本质上我希望随机访问内存映射文件,而不是顺序访问


这可能是在java中使用MemoryMappedFile的一个缺点吗?

在c/c++中,您可以创建一个int变量,该变量将指向内存映射的int,而不是在过程中调用未定义的行为。java没有指针的缺点与MMapped文件无关。有解决方法,但它们取决于您拥有的数据结构。@Torben所以您需要知道字节位置才能使用内存映射文件?对我来说,这是不可能的,因为我有一个包含多种基本数据类型的非常大的文件。在内存中复制数据要比从磁盘文件读取数据快得多。在任何情况下,您如何知道所需数据在磁盘或内存中的位置?根据我从中得到的信息,基本问题似乎是“在读取数据时,您是否有权知道数据的二进制结构”。我想你是的。正如Andrew Henle指出的,这也适用于C和C++。