2013-03-13 53 views
3

我需要在iOS中加載文件,現在我使用+ [NSString stringWithContentsOfFile:]。 這些文件大多是500kb到5mb。 我加載了一個約。 4mb大文件和樂器和秒錶告訴我它需要1.5秒來加載這個文件。在我看來它有點慢,有沒有辦法讓字符串更快?+ [NSString stringWithContentsOfFile:]性能

編輯:

我嘗試了一些東西,現在通知,NSString的的創作是我的問題,它需要的97%的時間,而不是從盤的實裝。

+0

什麼是「字符串」? – trojanfoe 2013-03-13 14:31:01

+0

其某種類型的CSV數據 – Sebastian 2013-03-13 14:32:06

+0

你是否在加載後將這個CSV「處理」成更好的數據結構? – trojanfoe 2013-03-13 14:34:28

回答

3

如果您知道編碼或可以確定它(您現在使用的API是基本的),那麼您可以將它作爲一個char緩衝區(以可識別編碼的方式)。

我會開始使用內存映射數據打開它(mmap,你也可以使用NSData來解決這個問題)。 madvise可用於提示您將如何訪問該文件。

如果內存映射I/O佔用太多的內存供您使用,您應該下降到增量讀取,如CI/O設備 - fopenfread,等等。這通常需要比存儲更多的I/O事件映射的數據(可能會慢得多,取決於數據的訪問方式)。

在這兩種情況下,你會認爲字符串作爲一個C字符串 - 不只是在打開整個文件轉換爲NSString

基金會有很多技巧,所以請確保這實際上提高了您的特定用例的性能。

如果這些解決方案太「核心供您使用,請考慮使用較小的文件(分割現有文件)。

+0

問題是最後我需要零件本身作爲NSString – Sebastian 2013-03-13 15:24:10

+1

@Sebastian是的 - 我看到了。你可以使用char表達式手動「解析」字符串,然後從chars的精確子範圍創建NSString。這可以最大限度地減少I/O,特別是如果你只需要一些文件的內容(你必須理解你的問題 - 如果使用不正確,我所建議的一切都可能會增加I/O)。另一種可能的方法是創建一個mmapped表達式,然後將返回的指針傳遞給映射內存到' - [NSString initWithBytesNoCopy:length:encoding:freeWhenDone:]'中。 – justin 2013-03-13 15:41:29

+1

謝謝,幫我解決我的問題。不,我不得不提高字符串的使用性能:) – Sebastian 2013-03-13 15:49:22

相關問題