在Java中打开大文件非常慢

2022-09-04 21:57:32

我有一个大(12GB)文件,我需要使用Java从中提取小块数据(每个几千字节)。一旦文件打开,查找和读取数据的速度非常快,但打开文件本身需要很长时间 - 大约90秒。有没有办法加快Java中的打开文件操作?

为了澄清,我尝试了以下选项来打开和读取文件:

new FileInputStream(file); 
new RandomAccessFile(file, "r");
Files.newByteChannel(path, StandardOpenOption.READ);

其中每一个都产生了类似的结果。


答案 1

来自commments:具体来说,问题是Java的打开文件操作触发了运行病毒扫描的操作系统操作,解决方案是将Java添加到可信进程列表中


答案 2

您遇到的问题主要是由您正在使用的JNI引起的。

当您的代码在构造函数期间等待 FileInputSream(String) 时。这非常证实了传递路径的存在并调用了一个方法。private native void open(String)

然后 OpenJDK 实现 FileInputSream#open(String) 如下所示:

    JNIEXPORT void JNICALL
    Java_java_io_FileInputStream_open(JNIEnv *env, jobject this, jstring path) {
        fileOpen(env, this, path, fis_fd, O_RDONLY);
    }

这使我们转向io_util_md.c和方法

jlong winFileHandleOpen(JNIEnv *env, jstring path, int flags)

您可以在那里分析代码。


此时,您有多种选择。

  • 检查不同的 JDK
  • 编写一个 C 代码,以生成 JNI 方法。
  • 检查差异网文件系统。