有这样几个3、400M的文本,结构如下:
产品名称 单价 数量 总价xxx x n x……
后面很多,且各文本中相互间产品名称有重复的,重复就要对数量和总价进行相加,
因为每个文本的数据量太大没法读入内存处理,请高手指点。
还有,不能用数据库
产品名称 单价 数量 总价xxx x n x……
后面很多,且各文本中相互间产品名称有重复的,重复就要对数量和总价进行相加,
因为每个文本的数据量太大没法读入内存处理,请高手指点。
还有,不能用数据库
解决方案 »
- 路径的写法
- 关于RichTextBox的问题 高手进
- 泛型T比较大小
- 不能在“ItemCollection”集合中使用“Binding”。 只能在 DependencyObject 的 DependencyProperty 上设置“Binding”。
- 怎么用C#把网站某区域截取成图片?
- DevExpress的XtraTreelist控件与ORacle数据绑定问题
- 关于C#设置IE可信站点的问题
- c#如何调出windows的选择文件对话框,选中文件后又怎么读出文件内的数据?
- 请帅哥推荐WinForm的好书,最好是有电子版的可以下载。谢谢啊
- 在VC#中如何实现语音的采集(从麦克风)和在网络中实时传输最好给代码,分不够可以再加,先奉上100分
- C#调用C++ DLL函数返回值错误
- c# 二维数组的不重复值加入
不算大,用文件流分段打开处理就可以了。别一次性读入内存。放数据库吧,比如access也行
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;
}
}
二、读取数据,一次从文本读一行。
using (StreamReader sr = new StreamReader(@"file.txt"))
{
string row;
while (sr.Peek() >= 0)
{
row = sr.ReadLine();
string[] cols = row.Split(' ');
string name = cols[0];
decimal price = decimal.Parse(cols[1]);
int count = int.Parse(cols[2]); table.Add(new Product(name, price, count));
}
}三、生成结果var result = table.GroupBy(k => k.name)
.Select(g => g.Select(p => new
{
name = g.Key,
price = p.price,
count = g.Sum(e => e.count),
total = p.price * g.Sum(e => e.count)
})).SelectMany(r => r);Console.WriteLine("产品名称 单价 数量 总价");
foreach (var p in result)
Console.WriteLine("{0} {1} {2} {3}", p.name, p.price, p.count, p.total);如果嫌速度慢,可以引入多线程和并行LINQ。
没处理完就显示内存溢出了
LZ,分两个步骤:
1、用HashTable,哈希表的空间伸缩范围要大。
2、遍历文本同时,进行计算处理,不能先装,在合并,这样消耗内存太大了!如果哈希表都不能解决你的问题,建议先把文本导入到数据库中,在进行处理,毕竟数据库伸缩的空间比内存要大多了。