日期:2014-05-18  浏览次数:20893 次

大文本数据合并
有这样几个3、400M的文本,结构如下:
产品名称 单价 数量 总价

xxx x n x

……
后面很多,且各文本中相互间产品名称有重复的,重复就要对数量和总价进行相加,
因为每个文本的数据量太大没法读入内存处理,请高手指点。。。。
还有,不能用数据库

------解决方案--------------------
探讨
有这样几个3、400M的文本,结构如下:
产品名称 单价 数量 总价

xxx x n x

……
后面很多,且各文本中相互间产品名称有重复的,重复就要对数量和总价进行相加,
因为每个文本的数据量太大没法读入内存处理,请高手指点。。。。
还有,不能用数据库

------解决方案--------------------
我想了想,这样做:

一、准备保存结果用的数据结构。总价=单价*数量,所以为了效率,最后再自动计算
C# code
List<Product> table = new List<Product>();

class Product
{
    public string name;
    public decimal price;
    public int count;

    private Product()
    {
    }

    public Product(string name, decimal price, int count)
    {
        this.name = name;
        this.price = price;
        this.count = count;
    }
}

------解决方案--------------------
数据量那么大,List<>的膨胀速度确实会很惊人。不行就自己简单地分一下页?

比如每读取5K行就汇总一次,把汇总结果存入一个中间文件,比如temp1.txt。然后再读下一个5K行,依此循环。

最后再对temp1.txt、temp2.txt这些中间文件进行二次汇总。

这么大数据量,不用数据库,真的很麻烦。
------解决方案--------------------
"最重要的是List<Product> table = new List<Product>();装不下合并的结果,没处理完就显示内存溢出了"
LZ,分两个步骤:
1、用HashTable,哈希表的空间伸缩范围要大。
2、遍历文本同时,进行计算处理,不能先装,在合并,这样消耗内存太大了!

如果哈希表都不能解决你的问题,建议先把文本导入到数据库中,在进行处理,毕竟数据库伸缩的空间比内存要大多了。。。。