java - 将大量数据从内存写入文件的最快方法是什么?

标签 java file io

我有一个程序会生成大量数据并将其放入队列中进行写入,但问题是它生成数据的速度比我当前写入的速度快(导致它达到最大内存并开始变慢)。顺序无关紧要,因为我打算稍后解析文件。

我四处看了看,发现了一些帮助我设计当前流程的问题(但我仍然觉得它很慢)。到目前为止,这是我的代码:

//...background multi-threaded process keeps building the queue..
FileWriter writer = new FileWriter("foo.txt",true);
        BufferedWriter bufferWritter = new BufferedWriter(writer);
        while(!queue_of_stuff_to_write.isEmpty()) {
            String data = solutions.poll().data;
            bufferWritter.newLine();
            bufferWritter.write(data);
        }
        bufferWritter.close();

我对编程很陌生,所以我可能会评估这个错误(可能是硬件问题,因为我使用的是 EC2),但是有没有一种方法可以非常快速地将队列结果转储到文件中,或者如果我的方法可以我以某种方式改进它?由于顺序无关紧要,在多个驱动器上写入多个文件是否更有意义?线程会使其更快吗?等等。我不确定最好的方法和任何建议都会很好。我的目标是保存队列的结果(抱歉没有输出到/dev/null :-) 并使我的应用程序的内存消耗尽可能低(我不是 100% 确定,但队列填满了 15gig,所以我我假设它将是一个 15gig+ 文件)。

Fastest way to write huge data in text file Java (意识到我应该使用缓冲写入器) Concurrent file write in Java on Windows (让我明白也许多线程写入不是一个好主意)

最佳答案

看着那段代码,我想到的一件事是字符编码。您正在编写字符串,但最终是进入流的字节。引擎盖下的编写器字符到字节编码,它在处理写入的同一个线程中执行。这可能意味着编码会延迟写入,这可能会降低写入数据的速率。

一个简单的更改是使用 byte[] 队列而不是 String,在推送到队列的线程中进行编码,并让 IO代码使用 BufferedOutputStream 而不是 BufferedWriter

如果编码文本平均每个字符占用少于两个字节,这也可以减少内存消耗。对于拉丁文本和 UTF-8 编码,这通常是正确的。

但是,我怀疑您生成数据的速度可能快于您的 IO 子系统处理数据的速度。您需要使您的 IO 子系统更快 - 通过使用更快的子系统(如果您使用的是 EC2,可能租用更快的实例,或者写入不同的后端 - SQS vs EBS vs 本地磁盘等),或者通过联合几个 IO 子系统以某种方式并行在一起。

关于java - 将大量数据从内存写入文件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076628/

相关文章:

c - 使用 MPI-IO 读取多个文件

使用一种公共(public)方法的 java/jUnit 测试类

java - MongoDB(或 Morphia)条件引用

java - Spring 事件和服务重启

c - 二维字符数组出现问题,程序无法打印

java - ObjectOutputStream 人类可读

java - 无法实例化 Activity - ClassNotFoundException

c++ - 从用户定义的文本文件中读取和打印字符

c# - Path.GetTempFileName() - 我可以将其更改为使用共享驱动器吗?

audio - 我如何连接/展平字节数组