日期:2014-05-17  浏览次数:20799 次

List<T> 内存中大数据量查询优化
 List<T> 中数据我存了3千万条数据,内存用了一个G左右,查询数据基本上用时在1.5 秒左右,想要优化,请问各位有没有什么好的建议?(不用数据库是因为这个数据变化不大,而且使用特别频繁,更重要的是数据库估计也抗不住)

------解决方案--------------------
你需要的是词法分析,索引与方向索引。
------解决方案--------------------
引用:
楼主需要的是算法,比如trie

如果对自己写算法没把握,或者要求不高的话,可以考虑开源的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];
            }