Java 将前10000行数据文件写入新文件的最快方式

Java 将前10000行数据文件写入新文件的最快方式,java,Java,我想要一个hyuuge(.csv)文件的前一万行 天真的生活方式 1) 创建读者和作者 2) 逐行读取原始文件行 3) 将前一万行写入新文件 不会是最快的吧 这将是我的应用程序中的常见操作,所以我有点担心速度,但也只是好奇而已 谢谢。在Java中有几种快速I/O的方法,但是如果不针对您的具体情况进行基准测试,就很难给出一个数字/建议。以下是您可以尝试基准测试的几种方法: 缓冲读写器,缓冲区大小可能不同 在内存中读取整个文件(如果可以的话),在内存中进行拆分,然后一次性写入所有文件 使用NIO文

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

天真的生活方式

1) 创建读者和作者

2) 逐行读取原始文件行

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

不会是最快的吧

这将是我的应用程序中的常见操作,所以我有点担心速度,但也只是好奇而已


谢谢。

在Java中有几种快速I/O的方法,但是如果不针对您的具体情况进行基准测试,就很难给出一个数字/建议。以下是您可以尝试基准测试的几种方法:

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

在Java中有几种快速I/O的方法,但是如果没有针对特定情况的基准测试,就很难给出一个数字/建议。以下是您可以尝试基准测试的几种方法:

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

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

相同长度的线。如果是这样,您可以使用RandomAccessFile读取x字节,然后将这些字节写入新文件。不过,它可能会占用大量内存。我怀疑这会更快,但可能值得进行基准测试。如果您只想读/写10000行左右,此解决方案仅适用于固定长度的行

  • 启动一个新的JVM可能需要比读/写文件更长的时间
  • 读/写时间应为几分之一秒。。。以天真的方式做,并且
  • 复制算法的总体速度不太值得
话虽如此,使用
BufferedReader.readLine()
或其他工具,您可以比一次读取一行做得更好

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

  • 如果使用NIO和ByteBuffers,则可以进一步减少内存中的复制量,尽管CR/LF计数逻辑将更加复杂


但是你应该问的第一个问题是,是否值得费心优化它。

如果你只想读/写10000行左右:

  • 启动一个新的JVM可能需要比读/写文件更长的时间
  • 读/写时间应为几分之一秒。。。以天真的方式做,并且
  • 复制算法的总体速度不太值得
话虽如此,使用
BufferedReader.readLine()
或其他工具,您可以比一次读取一行做得更好

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

  • 如果使用NIO和ByteBuffers,则可以进一步减少内存中的复制量,尽管CR/LF计数逻辑将更加复杂


但您应该问的第一个问题是,是否值得费心优化它。

最快的方法是使用
BufferedReader
读取流,并通过
StringBuffer
@AVD追加
StringBuffer
:我猜您的意思是
StringBuilder
StringBuffer
是同步的。最快的方法是使用
BufferedReader
读取流,并通过
StringBuffer
附加
String
@AVD:我想你的意思是
StringBuilder
StringBuffer
是同步的。啊,所以这不是一个答案既难又快的问题-希望它仍然是合适的。向上投票,但至少要等24小时才能接受。@Unfun猫:不幸的是,是的。此外,由于数据的行导向性(即文本数据而非二进制数据),使用高级文件i/O优化可能有点困难,因为它们依赖于从底层源读取固定大小的数据(缓冲区大小)。+1如果您有HDD,限制可能是您从磁盘读取文件的速度,所以你做什么都不重要。如果您正在从SSD或磁盘缓存中读取数据,那么您可以通过使用其他方法看到相对的改进。啊,所以这不是一个答案既简单又快速的问题-希望它仍然是合适的。向上投票,但至少要等24小时才能接受。@Unfun猫:不幸的是,是的。另外,由于数据的行导向性质(即文本数据而非二进制数据),使用高级文件i/O优化可能有点困难,因为它们依赖于从中读取固定大小的数据(缓冲区大小)