我已经开始了项目,这就是我所拥有的:
包含450K记录的Excel文件(exl1),每月多50K。
exl1格式
invoice#|Box#|Serial-#1|Serial-#2|5-val-enum#1|5-val-enum#2|10-val-enum|4-val-enum|timestamp
EX1:
abc123|box1|0987654321|A123456789|Plant|Tree|PersonName1|North|DateTime.Now
EX2:
qwe345|box9|12345678901234567890|#NA|Animal|Cat|PersonName1|South|DT.Now
包含大约50K记录的Excel文件(exl2)。 (以解释为目的命名为searchcVal) exl2格式 SERIAL1
EX1A:
A123456789
EX1B:
0987654321
EX2A:
12345678901234567890
以下是我必须做的事情:
将exl2(searchval)中的每个值与Serial#1或Serial#2进行比较,具体取决于exl1的5-val-enum#1的值(example1 = Plant,example2 = Animal)
如果searchVal以[a-z]开头搜索serial2,则搜索serial1;所以,用searchVal ex1a搜索col3和serachval ex1b搜索col2
if (exl1.Rows[columnHeader][col4].ToString() == "Plant")
{
string rowVal = exl2.Rows[rowIterator][col0].ToString();
if (regex.IsMatch(rowVal[0].ToString()))//checks to see if serial1 or serial2
{
if (rowVal == exl1.Rows[rowIterator][col3].ToString())
{
//add matched row to ResultsDT
}
else
{ //next row
}
}
else
{ //search col2 with same procedure
}
}
else
{//search col2
}
为了解释起见,让人说1匹配了400株植物,其中100株是树木,100棵是灌木丛,100棵是草,100朵是鲜花, 他匹配了400只动物,其中100只分别是猫,狗,蛇和鸟。有了这些匹配,我想将它总结为输出 摘要1:PersonName |植物|动物| category3 | Category4 | Category5,每个类别更详细一个 摘要2:PersonName | Trees | Bush | Grasses | Flowers to SUMM1:Person1 | 400 | 400 | x | n | y SUMM2(仅限植物):Person1 | 100 | 100 | 100 | 100
最重要的是:完成所有这些操作而不会杀死计算机上运行3小时的PC
答案 0 :(得分:2)
至少有两个选择:
答案 1 :(得分:1)
根据Excel更新/查询运行的比例,简单地将值读入sql server数据库并在那里查询/处理数据可能是个好主意?我想,将值读入sql server需要一些时间,但查询应该不会花费时间......
答案 2 :(得分:1)
我假设这里的问题是“我怎样才能有效地执行这项任务?”
答案是,你不应该。听起来你试图以便宜的方式做OLAP(除此之外,它可能不会严格在线发生),并且已经有很多解决方案可用于此。
由于您已经建立了使用Excel电子表格的既定程序,PALO可能符合您的需求(编辑它是免费的)。
或者,你所拥有的是一个非规范化的记录集;如果你将它标准化为几组&将它输入数据库(显然使用脚本),您可以让数据库负责密集计算。 修改:您可以使用许多免费数据库(SQL是一种语言,而非品牌)。例如。 PostgrSQL,MySQL
如果你坚持解析文件&自己分析文件,然后我建议你修改算法做两件事:
首先,让你的50k记录集合尽可能小的内存。显然,您不希望将记录存储为50k字符串:解析它们,并构建一个内存结构,只允许您访问所需的信息。 编辑:没关系,误解你的输入数据。
其次,修改算法,使其可以零碎运行。目前你有1组50k记录和另一组450k记录,听起来你希望每个月(或更频繁地)在整套记录上运行你的程序+任何记录已被添加到450k组中记录。如果您开始存储增量结果,您可以构建脚本以便它一次处理(例如)一次450k记录集中的多达10k条记录,并按顺序运行脚本的多个实例,可以避免重复 - 每月分析整个450k的记录,并有一个方便的停止和方式;中途启动过程(使用某种父脚本)。
对于更复杂的方法,请查看适用于算法的Divide and Conquer。