2012-09-01 90 views
0

我想要一個hyuuge(.csv)文件的前一萬行。將最初的10000行數據文件寫入新文件的最快方法

1天真的樣子)創建讀者&作家

2)閱讀線

3原始文件行)第一一萬行寫入到一個新的文件

不能是最快的,可以嗎?

這將是我的應用程序中的一個常見操作,所以我對速度略有擔心,但也只是好奇。

謝謝。

+0

*最快*方式*是*使用'BufferedReader'讀取數據流,並通過'StringBuffer'附加'strings'。 – adatapost

+2

@AVD:我想你的意思是'StringBuilder'; 'StringBuffer'被同步。 –

回答

3

有幾種方法可以做快速 Java中的I/O,但沒有針對您的特定情況進行基準測試,這很難拍出數字/建議。這裏有幾個方法,你可以嘗試標杆:

  • 緩衝讀/有可能變化的緩衝作家大小
  • 讀取整個文件在內存中(如果可以),並做一個內存中分裂和寫它都在一個去
  • 使用NIO文件API讀/寫文件(考慮通道)
+0

啊,所以這不是一個硬性答案,也不是一個問題 - 希望它仍然適用。 Upvote,但至少等待24小時才能接受。 –

+0

@ The Unfun貓:不幸的是。另外,由於數據的面向行的特性(即文本數據而不是二進制文件),使用先進的文件I/O優化可能有點難以應用,因爲它們依賴於讀取固定大小的數據(緩衝區大小)底層的來源。 –

+0

+1如果你有一個硬盤,限制可以從磁盤讀取文件的速度有多快,所以你做什麼並不重要。如果您正在從SSD或磁盤緩存讀取數據,則可以使用其他方法查看相對的改進。 –

0

是線的長度相同。如果是這樣,您可以使用RandomAccessFile讀取x個字節,然後將這些字節寫入新文件。儘管如此,這可能會讓你記憶猶新。我懷疑這會更快,但可能值得進行基準測試。這個解決方案只能用於固定長度的線

1

如果你只想讀/寫1萬行左右:

  • 它可能會需要更長的時間來啓動一個新的JVM,而不是讀/寫文件,
  • 讀/寫時間應該是一秒鐘的一小部分......這樣做的方式很幼稚,並且從複製算法的整體加速不太可能是值得的。

話雖如此,你可以做的比一次使用BufferedReader.readLine()或其他什麼時候讀一行更好。

  • 根據文件的字符編碼,您將獲得由具有的BufferedInputStream和的BufferedOutputStream大緩衝區大小做字節爲單位的I/O性能更好。只需編寫一個循環來讀取一個字節,有條件地更新行計數器並寫入字節......直到您複製了必需的行數。 (假設你可以通過檢查字節來檢測CR和/或LF字符,對於我所知道的所有字符編碼都是如此)。

  • 如果你使用NIO和ByteBuffers,你可以進一步減少內存複製,但CR/LF計數邏輯將更加複雜。

但是你應該問的第一個問題是,是否值得這樣做是值得的優化。

相關問題