List<T> 内存中大数据量查询优化
List<T> 中数据我存了3千万条数据,内存用了一个G左右,查询数据基本上用时在1.5 秒左右,想要优化,请问各位有没有什么好的建议?(不用数据库是因为这个数据变化不大,而且使用特别频繁,更重要的是数据库估计也抗不住)
------解决方案--------------------你需要的是词法分析,索引与方向索引。
------解决方案--------------------
如果对自己写算法没把握,或者要求不高的话,可以考虑开源的lucene.net
------解决方案--------------------试试 lucene 。 你的效果,要做分词, 索引 。 效率才能上去
------解决方案--------------------查询优化,主要是要做好索引。
比如,针对每个记录都比较短(<100),内存充裕的情况,可以对所有的字进行索引(常用汉字,可能就几千个)。
如果你知道包含'高'的字符串在[123,56789]等记录,那么匹配'高手'的时候,你只要到这些记录里面去搜索。
甚至你可以把包含'高','手'的记录作并集后,再进行匹配。
000001: 你好
...
000123: 高手
...
056789: 我是高手
...
---- 单字索引 ----
[00065]A:
[20320]你: 1
[22909]好: 1
[39640]高: 123, 56789
------解决方案--------------------就丢在数据库里吗建好索引就ok了
数据库索引本来就是一个hash表分布,可以快速定位。
------解决方案--------------------这个本来应该是由数据库完成的功能,何必自己去造轮子呢.由一些内存数据可供选择.
------解决方案--------------------你这LIST查询怎么写的啊 是for循环还是FindAll
lis1 = lis.FindAll(sk1 => sk1.Key.Contains("高"));
这一种看看
------解决方案--------------------Task多线程查询,应该会好点
------解决方案--------------------建个索引就好,比如下边这样。如果你不想包装IList的n多方法也可以直接从List<T>继承,但基本的Add Remove还是要重写成同步维护索引的
public class ListWithIndex<PrimaryKeyType, DataType> : IList<DataType>
{
List<DataType> data;
Dictionary<PrimaryKeyType, DataType> index;
public DataType this[int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
public DataType this[PrimaryKeyType index]
{
get
{
return this.index[index];
}