2017-06-14 80 views
16

我将每获得一个JSON字符串.01秒甚至更快,并且我必须将它插入某些集合中,以便稍后可以循环遍历每行并执行一些处理并在此之后删除该行。插入过程继续进行。我有点困惑是否使用ArrayListQueue什么集合类用来存储长字符串?

所以基本上我会插入第一条消息,然后第二条然后......同时另一个进程将读取第一个插入的值进行处理并删除该记录,然后是第二个插入的值。请告知哪一个最快,存储量更少?或者其他任何收藏品最适合我的要求?

编辑: 我有两种方法 -

的getMessages() - 它不断获取/这里将在队列中的消息(该消息是从只有一个不断发送消息并不会停止源接收直到我们手动停止进程)

ProcessMessages() - 这将读取队列记录和处理后,从队列

+13

'ArrayList'?至少10年以上不建议这样做。你应该只使用'System.Collections.Generic'中的任何东西。 – user9993

+2

字符串的长度完全不相关,因为集合只存储引用。字符串引用的数量是唯一相关的事情和“每一个。01秒“的速度并不快...... – Holger

回答

30

听起来像是你应该使用ConcurrentQueue<string>,其中一个线程可以把值删除另一个线程可能会弹出。

肯定don't use or even think of using the pre-generic ArrayList type ever again

您仍然需要一些簿记代码来检查您的处理是否比插入运行速度快,否则您可能会在某个时刻内存不足。

+1

我经常看到新的开发者使用'System.Collections'中的垃圾。我猜他们的Java背景让他们认为所有来自Java的集合类型都与.NET的集合类型有1:1映射。 – user9993

+8

@ user9993它似乎是显而易见的地方虽然开始... – Baldrickk

+1

我正在阅读关于ConcurrentQueue,并且该示例显示使用for循环在队列中进行迭代。但我的排队会不断增加或减少,所以我怎么知道什么时候循环?我想我可以迭代 - if(!concurrentQueue.IsEmpty),正确吗? – user1254053

11

从我如何读你的问题,你有两种基本要求:

  • 这是一个队列;
  • 同时排队和出队是安全的。

我会用ConcurrentQueue:它可以让你所谈论的排队机制,它也是线程安全的,所以你可以在同一时间,而不需要你自己锁在队列中添加和删除。

如果没有确切的信息,哪一个是最好的性能和内存智能是很难分辨的。如果你有很多重复的字符串,你可以尝试实习它们或者在你重复元素的地方创建一个缓存。

+0

我更喜欢@Dmitry Bychenko的回答。这显然是一种典型的生产者 - 消费者模式,而'BlockingCollection'则是一个更好的主意。无论如何,它已经在内部包装了一个ConcurrentQueue。 – user9993

21

看来你正在寻找一个生产者 - 消费者设计模式(Wikipedia Producer–consumer_problem)。

  1. 生产者创造的Json的
  2. 消费者处理它们

如果这是你的情况下,尝试BlockingCollection这是专门为此设计的。

+4

这可能确实是这个问题的更好的类型,另请参阅https://stackoverflow.com/questions/10010748/what-are-the-differences-between-concurrentqueue-and-blockingcollection-in-net – CodeCaster

+0

@Dmitry Bychenko - 感谢您的建议。这是否适用于FIFO? – user1254053

+0

@ user1254053:可以确保FIFO,请参阅https://stackoverflow.com/questions/3825275/does-blockingcollectiont-guarantee-removal-order –