2012-07-30 78 views
2

我正在研究一個讀取大文本文件(可以達到5GB大小)的應用程序。目前,我使用fscanf來讀取文件,因爲我發現它是迄今爲止最快的。但是,讀取整個文件仍然需要相當長的時間。閱讀一個非常大的文件

是否有更快的方式從文件中讀取數據?

+1

你可能想要使用'mmap':http://linux.die.net/man/2/mmap – 2012-07-30 16:08:06

回答

2

首先,您應該避免將5GB文件作爲一個單獨的步驟讀入內存。記憶力的影響本身就會讓你遠離這種做法。相反,你應該嘗試採取另一種方法,例如:當您閱讀它

  • 處理數據並扔掉數據
  • 將文件轉換爲前一個核心數據模型的工作
  • 轉換文件到一個固定長度的記錄格式,所以你可以做隨機訪問
  • 修改文件格式,使得它不太冗餘
  • 索引文件,這樣就可以做到隨機訪問
  • 將數據劃分爲單獨的文件
  • 內存映射文件使用NSFileWrapper(遠離萬能藥,但可以與上述結合使用; NSFileWrapper自動執行內存映射)

你應該得到一個性能基線開始:

time cat thebigfile.dat > /dev/null 

這是很難想象讀取文件比快得多,所以這是你的地板。

你一定要在儀器上做一些性能分析,並確保問題在於閱讀而不是處理。特別是,內存分配可能會比您預期的要貴,特別是在多線程應用程序中。

一旦你研究了上述情況,你仍然需要對磁盤數據進行真正的快速管理,請看dispatch_iodispatch_data。這是一個非常棒的高速數據管理工具。但是在擔心這種優化之前,先改進基本算法總是更好。

+0

我想我最大的問題是處理,而不是閱讀部分,因爲我目前已經設置逐行閱讀。所以我想我應該改述我的問題。有什麼方法可以更快地處理數據?就像我有一百萬行,每一行都具有相同的屬性(名稱,日期等)......我想將每行存儲在一個數組中。有沒有更快的方法,然後只是做object.name = ...然後[ObjectArray addObject:object]? – Matt 2012-08-01 00:17:14

+0

樂器說什麼?你的熱點在哪裏?直到你花了一些時間在樂器上,並且瞭解正在發生的事情,甚至不會開始優化。 – 2012-08-01 01:58:19