我正在使用:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("test.txt"),1024*1024*500))要写入一个大文件(大约2 2GB)。它需要26秒来写。但是,当我将500替换为10/20时,需要19秒。
在here中,我所理解的是缓冲提供了更好的性能。如果是这样,那么为什么会发生这种情况呢?我通过每次运行5次来检查它,所以系统/IO负载不是问题。
发布于 2012-04-13 23:16:23
正如我在上一个问题中所说的,存在一个最佳的缓冲区大小(通常约为32KB),并且当您将缓冲区设置得更大时,它将变得更慢而不是更快。默认缓冲区大小为8 KB。
顺便说一下:您的L2/L3 CPU缓存有多大?(我怀疑大约10MB)你的主L1缓存大约是32KB?
通过使用适合最快缓存的缓冲区,您可以使用最快的内存。通过使用只能放入主内存的缓冲区,您使用的是最慢的内存(低达10倍)
回答你的问题。
我所做的是假设ISO-8859-1编码,即(byte) ch,并且一次向ByteBuffer写入一个字节,可能是内存映射。
我有一些方法可以在不创建任何垃圾的情况下从ByteBuffer中写入/读取long和double。
使用这种方法,您每秒可以将大约500万行记录到磁盘。
发布于 2012-04-13 23:17:27
缓冲区过大会降低性能。坚持32-64 kb的IMO
发布于 2012-04-13 23:17:11
1024*1024*500是500兆字节,或多或少。您基本上是在强制JVM分配一个500mb的连续内存块,JVM可能必须执行一个GC周期才能做到这一点。
https://stackoverflow.com/questions/10143501
复制相似问题