【问题标题】:What collection classes to use to store long strings?使用什么集合类来存储长字符串?
【发布时间】:2017-11-16 06:31:39
【问题描述】:

我将每 0.01 秒甚至更快地获取一个 JSON 字符串,我必须将它插入到某个集合中,以便我以后可以遍历每一行并进行一些处理并在此之后删除该行。插入过程继续进行。我有点困惑是使用ArrayList还是Queue

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

编辑: 我有两种方法 -

GetMessages() - 不断在队列中获取/添加消息(这里的消息仅从一个源接收,该源不断发送消息并且在我们手动停止进程之前不会停止)

ProcessMessages() - 它将读取队列记录并在处理后从队列中删除它们

【问题讨论】:

  • ArrayList?至少 10 年以上没有被推荐过。你应该只使用来自System.Collections.Generic的任何东西。
  • 字符串的长度完全不相关,因为集合只存储引用。字符串引用的数量是唯一相关的事情,“每 0.01 秒”并不是快得令人难以置信……

标签: .net collections


【解决方案1】:

听起来您应该使用ConcurrentQueue<string>,其中一个线程可以推送另一个线程可以弹出的值。

绝对是don't use or even think of using the pre-generic ArrayList type ever again

您仍然需要一些簿记代码来检查您的处理是否比插入运行得更快,否则您肯定会在某个时候耗尽内存。

【讨论】:

  • 我经常看到新开发者使用来自System.Collections 的垃圾。我猜他们的 Java 背景让他们认为 Java 中的所有集合类型都有 1:1 映射到 .NET 的集合类型。
  • 我正在阅读有关 ConcurrentQueue 的内容,该示例显示了使用 for 循环在队列中进行迭代。但是我的队列会不断增加或减少,所以我怎么知道什么时候循环呢?我想我可以用 - if (!concurrentQueue.IsEmpty) 进行迭代,对吗?
  • 如果你想这样使用,Dmitry's answer 更好。
  • 我从服务器获取消息,所以只有一个生产者(关于阻塞收集)。我只是想确保按顺序收到的消息应该按相同的顺序处理。我正在阅读这两个选项。谢谢你们让我知道这些选项。
  • @user1254053 为什么要使用 for / for 每个循环来迭代队列?只需检查队列是否为非空,取出头部并对其进行处理。
【解决方案2】:

从我如何阅读您的问题来看,您基本上有两个要求:

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

我会使用ConcurrentQueue:它提供了您正在谈论的队列机制,并且它也是线程安全的,因此您可以同时添加和删除,而无需自己锁定队列。

如果没有确切的信息,很难判断哪一个性能和记忆力最好。如果你有很多重复的字符串,你可以尝试对它们进行实习,或者自己创建一个缓存来保持重复元素。

【讨论】:

  • 我更喜欢@Dmitry Bychenko 的回答。这显然是典型的生产者-消费者模式,BlockingCollection 是一个更好的主意。无论如何,它已经在内部包装了ConcurrentQueue
【解决方案3】:

您似乎正在寻找 Producer-Consumer 设计模式 (Wikipedia Producer–consumer_problem)。

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

如果是您的情况,请尝试专门为此设计的BlockingCollection

【讨论】:

猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2017-01-24
相关资源
最近更新 更多