2011-09-27 47 views
7

嗨我需要创建几个大的CSV文件,entires的顺序可能是200万。我所以我想知道如何有效地做到这一点..因此,几乎没有问题突然出现在我的脑海里用于创建大型CSV文件的Java IO的最佳做法

1。当我们通过BufferedWriter写入文件时,我们应该多久刷新一次?但我认为,bufferedWriter维护自己的缓冲区,并且一旦缓冲区满了,它会自动刷新它,如果是这种情况,那么为什么flush方法在那里呢?

  1. 由于我要创建的文件会很大。所以当我开始写文件时,文件会自动被提交到磁盘? (在调用writer.close()之前)或整个文件保留在主内存中,直到我关闭了作家?

    • 通过commiting我的意思是,没有了已经写好部分的一部分是在主内存中,即它已经准备好GC
+0

数据来自哪里?另一种基于磁盘的存储,通过网络或从内存中? – claymore1977

+0

数据来自数据库并且很少有业务验证并且需要生成处理这些文件 – dpsdce

回答

4
  1. BufferedWriter实施应做适当的刷新相当不错的工作。在你的情况下,你永远不需要拨打flush

    至于为什么有flush方法,这是因为有时你会希望输出立即写入,而不是等待BufferedWriter的缓冲区变满。 BufferedWriter不只是文件;它也可以用于写入控制台或套接字。例如,您可能希望通过网络发送一些数据,但数据不足以导致BufferedWriter自动刷新。为了立即发送此数据,您可以使用flush

  2. 您写入BufferedWriter的所有数据都不会同时保留在内存中。它被写成片断(刷新)为BufferedWriter的缓冲区填满。一旦你在最后调用close时,BufferedWriter将对其尚未写入磁盘并关闭文件的所有剩余内容进行最后一次刷新。

0

我倾向于在段工作,后刷新到磁盘每1k或2k线。有了这么多的数据,它似乎在推动内存限制。由于此操作可能已经很慢,因此安全方面经常失败并写入磁盘。

这是我的$ 0.02反正:)

3

如果您在包装用BufferedWriter你的作家,您指定磁盘恰好是一个物理写入之前保存在内存中的字节数。 (如果你没有指定,有一个默认值,我认为它是8k,但请不要将它作为福音引用。)

如果您使用PrintWriter,我认为它使用每行写入磁盘。

其他写入者通过每个I/O调用写入磁盘。没有缓冲。这通常会导致糟糕的表现。这就是为什么所有磁盘写入器都应该包装在BufferedWriter中的原因。

0

BufferedWriter使用固定大小的缓冲区,并且当缓冲区满时会自动刷新。因此,任何大文件都将以大块写入。

冲洗方法的存在是因为有时您可能希望在缓冲区满之前将某些内容写入磁盘。一个典型的例子是一个包装SocketOutputStream的BufferedWriter。如果你这样做:

writer.write(request); 
reader.read(response); 

你的线程可能无限期阻塞,因为请求将不会被发送,直到缓冲区满。因此你会这样做:

writer.write(request); 
writer.flush(); // make sure the request is sent now 
reader.read(response); 

改为。

相关问题