当前位置: 首页 > 面试题库 >

从二进制文件读取大量int的最快方法

邢浩邈
2023-03-14
问题内容

我在嵌入式Linux设备上使用Java 1.5,并且希望读取具有2MB int值的二进制文件。(现在是4字节的Big Endian,但我可以决定格式)

使用DataInputStreamvia BufferedInputStream 使用dis.readInt()),这500
000个调用需要17秒才能读取,但是读入一个大字节缓冲区的文件需要5秒。

我如何更快地将该文件读入一个巨大的int []?

读取过程不应使用额外的512 kb。

下面使用的这段代码nio并不比java io中的readInt()方法快。

    // asume I already know that there are now 500 000 int to read:
    int numInts = 500000;
    // here I want the result into
    int[] result = new int[numInts];
    int cnt = 0;

    RandomAccessFile aFile = new RandomAccessFile("filename", "r");
    FileChannel inChannel = aFile.getChannel();

    ByteBuffer buf = ByteBuffer.allocate(512 * 1024);

    int bytesRead = inChannel.read(buf); //read into buffer.

    while (bytesRead != -1) {

      buf.flip();  //make buffer ready for get()

      while(buf.hasRemaining() && cnt < numInts){
       // probably slow here since called 500 000 times
          result[cnt] = buf.getInt();
          cnt++;
      }

      buf.clear(); //make buffer ready for writing
      bytesRead = inChannel.read(buf);
    }


    aFile.close();
    inChannel.close();

更新:评估答案:

在PC上,使用IntBuffer方法的内存映射是我设置中最快的。
在没有jit的嵌入式设备上,java.io
DataiInputStream.readInt()快一些(17s,而带有IntBuffer的MemMap为20s)

最终结论:通过算法更改更容易实现明显的加速。(用于初始化的较小文件)


问题答案:

我不知道这是否会比Alexander提供的速度更快,但是您可以尝试映射文件。

    try (FileInputStream stream = new FileInputStream(filename)) {
        FileChannel inChannel = stream.getChannel();

        ByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
        int[] result = new int[500000];

        buffer.order( ByteOrder.BIG_ENDIAN );
        IntBuffer intBuffer = buffer.asIntBuffer( );
        intBuffer.get(result);
    }


 类似资料:
  • 问题内容: 当给定一个MAX_BUFFER_SIZE的缓冲区以及一个远远超过该缓冲区的文件时,怎么办: 以MAX_BUFFER_SIZE的块读取文件? 尽快完成 我尝试使用NIO 和常规IO 事实证明, 常规IO在执行与NIO相同的操作时快约100倍 。我想念什么吗?这是预期的吗?有没有更快的方法来读取缓冲区块中的文件? 最终,我正在处理一个大文件,但我没有足够的内存来一次读取所有文件。相反,我想

  • 问题内容: 我正在尝试从URLConnection读取二进制文件。当我使用文本文件对其进行测试时,它似乎可以正常工作,但对于二进制文件则不能。发送文件时,我在服务器上使用以下mime类型: 但是到目前为止,似乎没有任何效果。这是我用来接收文件的代码: 问题答案: 我就是这样

  • 所以。。。我需要从.pkl文件中读取并导入图像数据集。图像存储为“二进制blob”。一旦完成了,我需要将它们转换成字节格式,这样我就可以通过Google的CloudVision运行它们。我设法在Linux虚拟机上打开了该文件(花了几天时间试图让它在Windows上工作…)。但现在我似乎无法将这个“二进制斑点”转换为我可以使用的实际图像。。。 下面是一个“二进制blob”: \1\x0 0 0 0\

  • 问题内容: 我必须使用Java读取旧格式的二进制文件。 简而言之,该文件的标头由几个整数,字节和固定长度的char数组组成,后跟同样由整数和char组成的记录列表。 我可以用任何其他语言创建s(C / C ++)或s(Pascal / Delphi),它们是标题和记录的逐字节表示。然后,我将字节读入标头变量,并对记录执行相同的操作。 像这样:(Delphi) 用Java做类似的事情的最佳方法是什么

  • 本文向大家介绍C#读取二进制文件方法分析,包括了C#读取二进制文件方法分析的使用技巧和注意事项,需要的朋友参考一下 本文较为详细的分析了C#读取二进制文件方法。分享给大家供大家参考。具体分析如下: 当想到所有文件都转换为 XML时,确实是一件好事。但是,这并非事实。仍旧还有大量的文件格式不是XML,甚至也不是ASCII。二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递。相比之下,在处理

  • 问题内容: 我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番思考之后,由于Java中的所有内容都已签名(请纠正我,请纠正我),因此我长时间使用了该类型,我想不出更好的选择了。无论如何,仅需对数组进行排序,因此原始数字的精确值并不是最重要的。我们应该测量排序算法的效率,仅此而已。但是,当我实际要读取文件时(在下面的代码中),我遇到了砖墙。 它会一直持续下