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

Err*_*404 6 java io file

我有一个程序可以生成大量数据并将其放入队列中进行写入,但问题是它生成的数据比我当前正在编写的更快(导致它达到最大内存并开始减速).订单无关紧要,因为我打算稍后解析文件.

我环顾了一下,发现了一些问题,帮助我设计了当前的过程(但我仍觉得它很慢).到目前为止,这是我的代码:

//...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();
Run Code Online (Sandbox Code Playgroud)

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

在文本文件中编写大量数据的最快方法Java(实现我应该使用缓冲 编写器)在Windows上用Java编写并发文件(让我看到可能是多线程写入并不是一个好主意)

Tom*_*son 2

看着这段代码,我想到的一件事就是字符编码。您正在编写字符串,但最终进入流的是字节。编写器在底层进行字符到字节的编码,并且它在处理写入的同一个线程中执行此操作。这可能意味着编码所花费的时间会延迟写入,这可能会降低数据写入的速率。

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

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

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