2013-05-04 132 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