将前10 000行数据文件写入新文件的最快方法

时间:2012-09-01 06:13:28

标签: java

我想要一个hyuuge(.csv)文件的前一万行。

天真的方式

1)创建一个阅读器&作家

2)读取行的原始文件行

3)将前一万行写入新文件

不能是最快的,可以吗?

这将是我的应用程序中的常见操作,所以我稍微关注速度,但也只是好奇。

感谢。

3 个答案:

答案 0 :(得分:3)

有几种方法可以在Java中进行快速 I / O,但是对于你的特定情况没有基准测试,很难发现一个数字/建议。您可以通过以下几种方式尝试基准测试:

  • 可能具有不同缓冲区大小的缓冲读写器
  • 读取内存中的整个文件(如果可以)并进行内存中拆分并一次性写入
  • 使用NIO文件API读取/写入文件(查看频道)

答案 1 :(得分:1)

如果您只想读/写10,000行左右:

  • 启动新JVM可能需要更长时间,而不是读取/写入文件,
  • 读/写时间应该是一小部分......以天真的方式进行,
  • 复制算法的整体加速速度不太可能值得。

话虽如此,你可以比使用BufferedReader.readLine()或其他任何东西一次读一行更好。

  • 根据文件的字符编码,通过使用BufferedInputStream和具有大缓冲区大小的BufferedOutputStream进行逐字节I / O,可以获得更好的性能。只需编写一个循环来读取一个字节,有条件地更新行计数器并写入字节...直到复制了必需的行数。 (这假设您可以通过检查字节来检测CR和/或LF字符。对于我所知道的所有字符编码都是如此。)

  • 如果您使用NIO和ByteBuffers,您可以进一步减少内存中复制的数量,但CR / LF计数逻辑会更复杂。

但你应该问的第一个问题是,是否值得为此进行优化而烦恼。

答案 2 :(得分:0)

线条长度是否相同。如果是这样,您可以使用RandomAccessFile读取x个字节,然后将这些字节写入新文件。但它可能会占用大量内存。我怀疑这会更快但可能值得基准测试。该解决方案仅适用于固定长度线