当前位置: 首页 > 知识库问答 >
问题:

使用vertx读取大文件

邢华清
2023-03-14

我不熟悉使用vertx,我正在使用vertx文件系统api来读取大文件。

vertx.fileSystem().readFile("target/classes/readme.txt", result -> {
    if (result.succeeded()) {
        System.out.println(result.result());
    } else {
        System.err.println("Oh oh ..." + result.cause());
    }
});

但是RAM在读取时被消耗殆尽,资源在使用后甚至没有被刷新。vertx文件系统api还建议不要使用此方法读取非常大的文件,否则可能会耗尽可用的RAM。

除此之外还有其他选择吗?

共有3个答案

沈茂
2023-03-14

原因是内部。readFile调用文件。readAllBytes

相反,您应该做的是从文件中创建一个流,并将其传递给Vertx处理程序:

    try (InputStream steam = new FileInputStream("target/classes/readme.txt")) {
        // Your handling here
    }
杜联
2023-03-14

要以块形式读取/处理大文件,您需要使用open()方法,该方法将在成功时返回AsyncFile。在此AsyncFile上,您setReadBufferSize()(或否,默认值为8192),并附加一个handler(),它将被传递一个最多为您刚刚设置的读取缓冲区大小的Buffer

在下面的示例中,我还附加了一个endHandler(),以打印最后的换行符,以与您在问题中提供的示例代码保持一致:

vertx.fileSystem().open("target/classes/readme.txt", new OpenOptions().setWrite(false).setCreate(false), result -> {
    if (result.succeeded()) {
        result.result().setReadBufferSize(READ_BUFFER_SIZE).handler(data -> System.out.print(data.toString()))
                                            .endHandler(v -> System.out.println());
    } else {
        System.err.println("Oh oh ..." + result.cause());
    }
});

当然,您需要在某个地方定义READ_BUFFER_SIZE

司空锋
2023-03-14

要读取大文件,应打开一个异步文件:

OpenOptions options = new OpenOptions();
fileSystem.open("myfile.txt", options, res -> {
    if (res.succeeded()) {
        AsyncFile file = res.result();
    } else {
        // Something went wrong!
    }
});

然后,异步文件是一个读取流,因此您可以将其与泵一起使用,将位复制到写入流:

Pump.pump(file, output).start();
file.endHandler((r) -> {
    System.out.println("Copy done");
});

有不同类型的WriteStream,如异步文件、网络套接字、HTTP服务器响应等。。。等

 类似资料:
  • 问题内容: 我尝试使用具有96GB RAM的服务器上的 fs.readFileSync 将大文件( 〜6Gb )加载到内存中。 问题是它失败并显示以下错误消息 RangeError:尝试分配大于最大大小的缓冲区:0x3fffffff字节 不幸的是,我没有发现增加Buffer的可能性,这似乎是一个常数。 如何克服此问题并使用Node.js加载大文件? 谢谢! 问题答案: 来自一个快乐的常见问题解答:

  • 我正在使用vertx websocket。我正在通过它发送一个大文件。使用文件系统的最佳方式是什么?如果多个帧到达同一个文件,异步文件系统可能无法正常工作。有什么建议吗?

  • 我使用Dask读取2.5GB csv文件,Python给了我错误。这是我写的代码: 以下是我从Python得到的错误: dask_df=df1.read_csv('3SPACK_N150_7Ah_压力分布研究_Data_Matrix.csv')) 文件“C:\ProgramData\Anaconda3\lib\site packages\dask\dataframe\io\csv.py”,第645

  • 我正试图模拟TCP服务器,以便在必须使用的现有基础设施的基础上使用Vertx进行测试。 我模拟的服务器工作完全异步,并且根据缓冲区中指示请求长度的前置标头知道传入缓冲区的长度。 我需要读取连接到模拟TCP服务器的每个客户端套接字上传入请求的前6个字符。从这个预标题中,我读取了请求的实际长度(例如,对于xx3018,我知道请求的完整长度是3018)。 使用普通java的工作模拟服务器示例(快速实现,

  • 问题内容: 我需要阅读几个大(200Mb-500Mb)XML文件,所以我想使用StaX。我的系统有两个模块- 一个用于读取文件(使用StaX);另一个用于读取文件。另一个模块(“解析器”模块)假定获取该XML的单个条目并使用DOM对其进行解析。我的XML文件没有特定的结构-因此我无法使用JaxB。如何向“解析器”模块传递要解析的特定条目?例如: 我想使用StaX来解析该文件-但是每个“项目”条目都

  • 问题内容: 如何使用框架有效地从大文件读取并将大数据写入文件。 我工作,并和曾尝试类似如下: 谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,