【发布时间】:2012-04-22 00:40:11
【问题描述】:
我有一个程序可以生成大量数据并将其放入队列中以进行写入,但问题是它生成数据的速度比我当前正在写入的速度快(导致它达到最大内存并开始变慢)。顺序无关紧要,因为我打算稍后解析文件。
我环顾四周,发现了一些帮助我设计当前流程的问题(但我仍然觉得它很慢)。到目前为止,这是我的代码:
//...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(让我看到多线程写入可能不是一个好主意)
【问题讨论】:
-
我了解cpu速度>硬盘速度,所以写入可能总是输给处理,我只是想弄清楚如何帮助高清速度更接近处理它。
-
很大程度上取决于你的瓶颈是什么。我怀疑如果您最大化磁盘 IO 的带宽(这似乎是您的问题),您也可以最大化您的帐户(就成本而言)我同意多线程写入不会有太大帮助。
-
粗略计算,15 GB 每次花费 4 美元。
-
@PeterLawrey 临时存储没有成本(它包含在实例中,但不是持久的),我的可用空间不到 TB。
-
如果您不关心成本,我会先看看尽可能快地写入文件需要多长时间。例如从命令行使用
dd。或者您可以在大块中使用 NIO,例如32-256KB。