2013-05-04 129 views
2

我有一個大的NSMutableString(潛在的數百兆字節),需要對它執行很多rangeOfCharacterFromSet:操作。NSMutableString線程安全?

爲了提高性能,我希望有一個NSOperationQueue將字符串拆分成〜100kb的塊並異步處理每個塊。

但是由於字符串太大,爲每個線程製作不可變副本是不可行的。

假設我不允許修改字符串(我打算阻塞主線程直到操作隊列完成),這是否安全?

Apple文檔NSString作爲線程安全和所有不可變的對象「一般」不是線程安全的,但大概它只適用於某些方法? rangeOfCharacterFromSet是我正在使用的唯一一個。

此代碼將在兩個OS X在iOS(通常在iOS較小的字符串)

+0

爲什麼每個線程都有獨立的「副本」原始NSString?如果字符串不允許被修改,爲什麼還要使用NSMutableString? – user2246674 2013-05-04 00:29:25

+0

爲什麼要阻止主線程?如果你打算這麼做,線程的目的是什麼? – matt 2013-05-04 00:30:10

+0

我還有一個問題:你真的*測試*性能,還是隻是猜測?你知道嗎*有一個性能問題需要分割字符串? – matt 2013-05-04 00:32:39

回答

3

雖然我懷疑的NSMutableString(或其至少常見的實現)運行是這個安全的,最安全的答案很可能是創造一個單一的不可變副本,然後執行所有的操作。

我的警告是因爲非常大的NSMutableStrings可能在內部實現爲樹,如果該樹在讀取時執行延遲重新平衡,則可能存在線程安全問題。

+0

我希望我的應用程序能夠打開儘可能大的文件(即使這可能意味着用戶必須等待幾秒鐘才能最初打開該文件),創建副本會使應用程序的內存消耗增加一倍,所以我真的很想躲開它。我必須做一些更復雜的事情,比如創建第一個50MB數據的不可變副本,並行處理,然後創建下一個50MB的不可變副本......呃。 – 2013-05-04 01:07:47

+1

這是進入「hacky依靠實現細節」的東西,但如果你不願意依靠「它可能很好」(我完全理解),那麼你可以做一些事情像一個--rangeOfString:連續嘗試觸發任何可能的懶惰狀態更改,然後同時休息。 – 2013-05-04 01:11:19

+0

你是否需要*將文件一次加載到內存中?爲什麼不考慮'mmap'什麼的? – dreamlax 2013-05-04 02:22:47