搜索大型Excel文件并有效处理大量数据

时间:2011-06-23 08:04:14

标签: c# algorithm performance search

我已经开始了项目,这就是我所拥有的:

包含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

以下是我必须做的事情:

  1. 将exl2(searchval)中的每个值与Serial#1或Serial#2进行比较,具体取决于exl1的5-val-enum#1的值(example1 = Plant,example2 = Animal)

  2. 如果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
        }
    
  3. 为了解释起见,让人说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

  4. 最重要的是:完成所有这些操作而不会杀死计算机上运行3小时的PC

3 个答案:

答案 0 :(得分:2)

至少有两个选择:

  1. 将excel视为数据库并检查其性能 - 以下是如何执行此操作:http://www.beansoftware.com/NET-Tutorials/Excel-ADO.NET-Database.aspx
  2. 如果选项no 1太慢,请将此数据导入真实数据库(ms sql,mysql,postgresql等),添加适当的索引并在db中执行搜索。 excel将被视为初始导入的数据源。

答案 1 :(得分:1)

根据Excel更新/查询运行的比例,简单地将值读入sql server数据库并在那里查询/处理数据可能是个好主意?我想,将值读入sql server需要一些时间,但查询应该不会花费时间......

答案 2 :(得分:1)

我假设这里的问题是“我怎样才能有效地执行这项任务?”

答案是,你不应该。听起来你试图以便宜的方式做OLAP(除此之外,它可能不会严格在线发生),并且已经有很多解决方案可用于此。

由于您已经建立了使用Excel电子表格的既定程序,PALO可能符合您的需求(编辑它是免费的)。

或者,你所拥有的是一个非规范化的记录集;如果你将它标准化为几组&将它输入数据库(显然使用脚本),您可以让数据库负责密集计算。 修改:您可以使用许多免费数据库(SQL是一种语言,而非品牌)。例如。 PostgrSQLMySQL

如果你坚持解析文件&自己分析文件,然后我建议你修改算法做两件事:

首先,让你的50k记录集合尽可能小的内存。显然,您不希望将记录存储为50k字符串:解析它们,并构建一个内存结构,只允许您访问所需的信息。 编辑:没关系,误解你的输入数据。

其次,修改算法,使其可以零碎运行。目前你有1组50k记录和另一组450k记录,听起来你希望每个月(或更频繁地)在整套记录上运行你的程序+任何记录已被添加到450k组中记录。如果您开始存储增量结果,您可以构建脚本以便它一次处理(例如)一次450k记录集中的多达10k条记录,并按顺序运行脚本的多个实例,可以避免重复 - 每月分析整个450k的记录,并有一个方便的停止和方式;中途启动过程(使用某种父脚本)。

对于更复杂的方法,请查看适用于算法的Divide and Conquer