2012-06-13 124 views
2

我必須一次處理大量的數據。因此,我使用Blocks或NSOperationQueue。 一切工作正常,直到要處理的數據量超過內存限制。 這會導致應用程序崩潰。如何處理併發執行的大量數據(NSOperationQueue或Blocks)

原因是我必須處理的數據包大約是。 100KB大。 超過300-400個此操作在隊列中排隊後,將超出內存限制。

現在我想知道你們是如何處理類似問題的? 順便說一句:我沒有找到一種方法來限制隊列大小,除非我添加同步任務,這將導致堆棧在返回之前完成。

在此先感謝您的任何提示。

+0

你可以對這些「數據包」的性質更具體一點嗎?你是否需要排隊所有300-400個隊列,或者你可以排隊幾個(或一個),然後在每個隊列完成後再向隊列中添加另一個隊列?你是爲所有這些軟件包準備數據嗎,還是每個進程都檢索和處理特定的數據包?底線,你的問題非常神祕。您可以更具體(尤其是代碼示例),我們可能會更有幫助。 – Rob

+0

謝謝羅伯特。我想知道是否有任何模式可以用來解決這些問題。當然,我可以同步解決問題的過程。但我寧願在使用ThreadPoolExecutor時擁有更多的控制權,例如Java中的控制權。但我在iOS中沒有看到類似的概念。 –

+0

我對ThreadPoolExecutor不熟悉,因此我很難回答這個問題。我不知道ThreadPoolExecutor提供了什麼功能,您正在尋找。我不明白你原來的業務問題是否足以回答這個問題。也許別人可以在摘要中回答這個問題。您是否熟悉iOS操作隊列,調度隊列和調度源,如Apple [併發編程指南](http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction /Introduction.html)? – Rob

回答

1

NSOperation is大致相當於ThreadPoolExecutor。所以你已經在使用它了。如果你正在耗盡你的內存,你的併發方法可能不是問題。

聽起來您正在構建300-400個任務(NSOperations或GCD塊),並且在您執行之前內存不足。爲什麼不在添加它們時執行它們?這就是NSOperationQueue和GCD隊列對於,很像ThreadPoolExecutor。

+0

這正是我想要做的,但創建任務比他們正在處理的要快得多。這意味着任務將轉到NSOperationQueue並等待處理。但是有太多的等待任務導致短暫的記憶峯值,然後導致應用程序終止。 –