gpt4 book ai didi

java - 这是读取充满 double 的二进制文件的好方法吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:03 24 4
gpt4 key购买 nike

我有一个二进制文件列表,我需要读取这些文件,然后将其存储到变量中。每个文件都是大量 double 的集合。这些文件是在linux下用C语言中的double类型的C程序保存的。现在,我想使用 Java 读取所有这些文件。这是您能实现的最快方法吗?在我的 PC 中,读取 10 个文件(每个文件 1.5 Mb,每个文件 194,672 个 double )并将它们存储到数组中需要 24 秒。我正在考虑使用某种类型的缓冲区,但我不确定是否应该留下一些字节......

    int i;
int num_f = 10;
int num_d = 194672;

File folder = new File(route);
File[] listOfFiles = folder.listFiles();

float double_list[][] = new float[num_f][num_d];

for (int file = 0; file < listOfFiles.length; file++) {
if (listOfFiles[file].isFile()) {
try{
br = new DataInputStream(new FileInputStream(listOfFiles[file].getAbsolutePath()));
//We read all file
i = 0;
while(br.available() > 0) {
//I know that float != double but I don't think I will lose a huge precision
//as the double numbers stored are in a region [-5,5] and with this way I reduce
//the amount of memory needed. (float) is not cpu consuming (<1s).
double_list[file][i++] = (float) br.readDouble();
}

}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//Close file
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

最佳答案

最后,我可以在 Andreas 和这个网站 ( http://pulasthisupun.blogspot.com.es/2016/06/reading-and-writing-binary-files-in.html ) 的帮助下做到这一点(检查其他类型格式!)。对于字节顺序,默认选项是 BIG_ENDIAN 代码,但这样我就得到了无穷大数字等无意义的东西。尽管如此,通过 LITTLE_ENDIAN 我得到了正确的数字!不过,我将来必须做一些测试,以确保我不必从一开始就留出一些额外的字节......

顺便说一句,花费的时间:0.160048575s,还不错;)

int i;
int num_f = 10;
int num_d = 194672;

File folder = new File(route);
File[] listOfFiles = folder.listFiles();

float double_list[][] = new float[num_f][num_d];

for (int file = 0; file < listOfFiles.length; file++) {
if (listOfFiles[file].isFile()) {
try{
fc = (FileChannel) Files.newByteChannel(Paths.get(listOfFiles[file].getAbsolutePath()), StandardOpenOption.READ);
byteBuffer = ByteBuffer.allocate((int)fc.size());
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
fc.read(byteBuffer);
byteBuffer.flip();

buffer = byteBuffer.asDoubleBuffer();
((DoubleBuffer)buffer).get(double_list[file]);
byteBuffer.clear();

fc.close();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//Close file
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

关于java - 这是读取充满 double 的二进制文件的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44473506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com