0

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

天真的方式

1)创建一个读者和作家

2)逐行读取原始文件行

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

不可能是最快的,不是吗?

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

谢谢。

4

3 回答 3

3

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

  • 缓冲区大小可能不同的缓冲读取器/写入器
  • 读取内存中的整个文件(如果可以的话)并进行内存拆分并一次性将其全部写入
  • 使用 NIO 文件 API 读取/写入文件(查看 Channels)
于 2012-09-01T06:19:31.287 回答
1

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

  • 启动一个新的 JVM 可能比读/写文件需要更长的时间,
  • 读/写时间应该是几分之一秒......以天真的方式进行,并且
  • 复制算法的整体速度不太可能值得。

BufferedReader.readLine()话虽如此,您可以比使用或其他方式一次阅读一行做得更好。

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

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

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

于 2012-09-01T06:33:31.247 回答
0

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

于 2012-09-01T06:31:53.500 回答