【问题标题】:Huge list of long & search nearest element庞大的长列表和搜索最近的元素
【发布时间】:2015-08-14 12:04:46
【问题描述】:

情况如下。

我有一些对象包含:

  • 一个起始long
  • 结尾long
  • string 代码

这些对象longs 是连续的。 例如:

var obj1 = new {From = 0, To = 16777215, Code = "aaa"};
var obj2 = new {From = 16777216, To = 16777471, Code = "bbb"};

有近 150.000 个这样的对象。

目前我将所有内容都存储在 SQL 表中。

问题是我需要从这个列表中搜索。例如,我需要查找编号为 16777470 的对象,即对象 2“bbb”。

问题:有没有一种有效的方法可以将如此多的对象存储在内存中,并能够在其中寻找元素,并寻找最近的元素?

【问题讨论】:

  • 在排序列表上,二分查找可以工作。
  • 即使对象平均为 50 字节,总共也不到 8MB:适合许多当代 CPU 的缓存。 IE。不大。
  • 而且它需要在内存上是必要的?因为在 SQL 上有有效的方法来做到这一点。
  • 它现在已经在 SQL 中了,但我很害怕,因为这种查找每分钟会发生数千次,我不想让已经高度请求的数据库过载:) .

标签: c# list search


【解决方案1】:

如果对象是连续的,那么您只需要存储“发件人”编号。

var obj1 = new {From = 0, Code = "aaa"};
var obj2 = new {From = 16777216, Code = "bbb"};

这将节省内存。

然后,如果所有对象都在有序列表中,则二进制印章应该解决有效搜索。

主要的性能损失可能在于首先设置列表,所以我认为保留 SQL 数据库的建议可能是明智的。

【讨论】:

    【解决方案2】:

    从内存效率的角度来看,我不确定。

    思考:您当然也不想搜索整个列表,因此可能需要某种二级结构(某种索引或查找????)。

    无论如何,我偶然发现了这个: How to get the closest number from a List<int> with LINQ?

    怀疑这种方法可能有点处理器密集型,因为它没有二级索引。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2016-02-11
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多