读书人

大量数据的处理!解决思路

发布时间: 2012-06-08 12:55:24 作者: rapoo

大量数据的处理!
public class Data
{
public int DID;

public List<int> Items; //长度为16

//统计字段 有50个
public int C010; //统计 前0-10个范围为真的个数

.......


public int C5001000; //统计 500-1000范围为真的个数

}

Data对象有30W个

public class HistData
{
public int HID;

public List<int> Items; //长度为6
}

HistData对象 现有1000多条 (可增长,)

要求是 用每个HistData对象 跟 Data做比较 并判断 Data.Items 是否包含 HistData.Items的数据
假如HistData 对象为10条 ,Data为1条的话.将会产生以下结果 (T = true or F = false)

T
F
T
F
T
F
T
F
T
T


并且统计 如 0-10 中 为真的个数 ! 而且每拿HistData 对象 跟Data (30W个)对象 选择某些满足条件的Data对象保留下来!

怎么速度最快!



[解决办法]
如果自己没有更好的办法,可以使用LINQ
[解决办法]
使用线程池,分批处理。
HistData假如有30W个,你开20个线程(根据你的电脑配置开更高),每个线程处理100个HistData。
哪条线程工作完成,继续处理后面的数据。
再开一条线程用来处理完成的数据。

[解决办法]
问题没有说清楚
但我认为你可以考虑数组结合指针来提高效率.
[解决办法]
如果你确保你的机器cpu数量够多,就用线程吧,如果是单cpu线程只会降低效率
[解决办法]
若都是取自,可以先在中用存程理,然後只需取出果即可,不是什都有必要在程序中的。。。
[解决办法]
现在的CPU都是多核超线程。20个线程应该可以的吧
[解决办法]
学习一下,一直对于大数据量没有什么好办法呢!
[解决办法]
耗时操作只不过是Items与Items之间的比对。而且好像这个整体的设计上也有问题,但是说不出是哪儿,可能我不知道业务逻辑的具体内容吧。

不过其余的地方,注意精简代码即可。比对可以用下面这一招,前提,你内存要大。

public bool InHistData(Data data,HistData histData)
{
Dictionary<string[Item的唯一标识],Item[HistData里面的Item]> histDataMapping = new
Dictionary<string,Item>();
foreach(Item item in histData.Items)
{
histDataMapping.Add(item.[唯一标识],item);
}

foreach(Item item in data.Items)
{
if(!histDataMapping.ContainsKey(item.唯一标识))
{
return false;
}
}
return true;
}
[解决办法]
1:都在内存中,多线程没有意义。
2:其实就是一个 sql连接查询:
所有 Data.Items 组成 表1 (数据所在的index需要保存)
所有 HistData.Items 组成 表2 连接条件是

所以简单的办法是写到两张表,然后执行连接查询,使用top之类的条件获得结果。

3:如果硬要在内存
如果硬要在内存中完成,思路应该是:
对Data.items排序
对HistData.Items排序,建立链表说明HistData.Items中的值和HistData的映射关系
执行查找
   排序和查找,使用二分就可以了,使用B+或B-算法也不错。
[解决办法]
并判断 Data.Items 是否包含 HistData.Items的数据
你的定义里用的是List,而List是通过遍历整个数组进行比较的,建议修改定义为Dictionary
如:
public class Data
{
public int DID;
public Dictionary<int, bool> Items; //key为原来的元素,value无作用,仅作填充


不过具体还要看你的业务,因为你的每个Items都才16个,所以上面的修改,作用不大,还是要看你的业务,来修改成具体可用的优化代码


[解决办法]

探讨
1:都在内存中,多线程没有意义。
2:其实就是一个 sql连接查询:
所有 Data.Items 组成 表1 (数据所在的index需要保存)
所有 HistData.Items 组成 表2 连接条件是

所以简单的办法是写到两张表,然后执行连接查询,使用top之类的条件获得结果。

3:如果硬要在内存
如果硬要在内存中完成,思路应该是:
对Data.i……

------解决方案--------------------


如果多线程那么有用,那你用并行计算是不是会更快%
[解决办法]

探讨

耗时操作只不过是Items与Items之间的比对。而且好像这个整体的设计上也有问题,但是说不出是哪儿,可能我不知道业务逻辑的具体内容吧。

不过其余的地方,注意精简代码即可。比对可以用下面这一招,前提,你内存要大。

public bool InHistData(Data data,HistData histData)
{
Dictionary<string[Item的唯一……

读书人网 >C#

热点推荐