我不熟悉使用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。
除此之外还有其他选择吗?
原因是内部。readFile调用文件。readAllBytes
。
相反,您应该做的是从文件中创建一个流,并将其传递给Vertx处理程序:
try (InputStream steam = new FileInputStream("target/classes/readme.txt")) {
// Your handling here
}
要以块形式读取/处理大文件,您需要使用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
。
要读取大文件,应打开一个异步文件:
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,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,