2017-06-13 358 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。 –

相关问题