2017-06-13 359 views
0

我正在研究一個問題,它需要在一個非常大的圖上進行BFS遍歷。假設1個頂點最多可以有2^32個邊連接到其他頂點。 我試過使用System.Collection.Queue,但我快速得到一個內存不足的例外。什麼是在c#中實現隊列的最佳方式(System.Collection.Queue有內存限制)

我也嘗試使用FileStream來實現Queue persist到文件,但它真的很慢。從支持的文件中沒有像RemoveFirstLine這樣的方法。爲了刪除第一行,我必須RealAllLine,刪除內存對象中的第一行,然後寫回文件。

我想知道是否有任何現有的第三方庫實現這樣一個隊列,而不用擔心內存。

如果不是,那麼在c#中實現它的最好方法是什麼。 什麼是最好的FileXXXX類可以做的工作。

+0

如果阻止你這樣做的異常是'OutOfMemoryException',那麼你將無法在不使用文件系統的情況下實現這麼大的隊列。 –

+0

如果您在應用內的任何數據結構中實現自己的隊列,則會遇到內存問題。 幾點建議:1)使用文件系統2)使用外部消息隊列,例如。 Redis,AWS SQS,RabbitMQ等 –

+0

我確實考慮用File系統來實現這樣一個隊列,抽象接口不是太複雜。只是入隊,出隊。但是,我沒有找到正確的.net類來高效地完成它。請參閱上文。 我還沒有想過Redis,AWS SQS,RabbitMQ。我不確定在這裏是否需要異步消息隊列。 –

回答

1

隊列很難找到正確的,但是如果你正在處理超大型數據集,你應該確保a)保存它與永久存儲一起保存b)確保多個進程/線程同時訪問不會導致腐敗或重複工作。我強烈建議使用第三方實施,除非你有一些非常具體的要求。我還要加上c)確保你有某種恢復處理的方式,即使在嚴重故障之後(例如停電,當一個進程處理消息的一半時可能發生停電)。前提是一個相當簡單的多進程安全實現可以使用每個隊列消息1個文件,並利用獨佔的讀鎖訪問來確保只有一個進程可以隨時讀取新文件(並刪除文件而不是釋放鎖定完成後)。

+0

到目前爲止,我不需要考慮多進程,因爲BFS算法本身可能不支持多進程/線程。 我確實需要小心文件訪問衝突,因爲我需要執行讀取和寫入操作。現在,我每次關閉FileStream以確保一致性。嘗試只是做Flush()但它不起作用。所以我必須關閉Stream。 –

相關問題