我有以下算法,private void writetodb(){using(var reader = File.OpenRead(C:\Data.csv);using(var parser = new TextFieldParser(reader)){ //Do some opeartionswhile(!parser.EndOfData){//Do operations//Ta...

我有以下算法,
private void writetodb()
{
using(var reader = File.OpenRead("C:\Data.csv");
using(var parser = new TextFieldParser(reader))
{
//Do some opeartions
while(!parser.EndOfData)
{
//Do operations
//Take 500 rows of data and put it in dataset
Thread thread = new thread(() => WriteTodb(tablename, set));
thread.Start();
Thread.Sleep(5000);
}
}
}
public void WriteTodb(string table, CellSet set)
{
//WriteToDB
//Edit: This statement will write to hbase db in hdinsight
hbase.StoreCells(TableName, set);
}
这种方法绝对可以正常工作,直到500 MB的数据,但在此之后它无法说出内存不足异常.
我非常确定这是因为线程,但使用线程是强制性的,我不能改变架构.
任何人都可以告诉我在上面的程序中我必须在线程编程中进行哪些修改以避免内存异常.
解决方法:
首先,我无法理解你关于线程的说法:
I have to make in thread programming in the above program to avoid
memory exception.
如果您使用TPL,则将使用线程编程,如已经建议的那样.如果你无法理解它,你真的不必使用Thread类.你说你的代码是C#4.0所以TPL是你的选择.你可以做这样的事情(很简单的方法):
List<Task> tasks = new List<Task>();
while(!parser.EndOfData)
{
tasks.Add(Task.Run(() => WriteTodb(tablename, set)));
}
Task.WaitAll(tasks.ToArray());
TPL引擎将使用默认的TaskScheduler类,该类使用内部ThreadPool并可以对服务器上的资源进行调平.
另外,我看到您使用的是Microsoft的HBase客户端,其中包含it has async method:
public async Task StoreCellsAsync(string table, CellSet cells)
{
}
所以你可以use the asynchronious approach in your code and TPL at the same time:
List<Task> tasks = new List<Task>();
while(!parser.EndOfData)
{
tasks.Add(WriteTodb(tablename, set)));
}
// asynchroniously await all the writes
await Task.WhenAll(tasks.ToArray());
public async Task WriteTodb(string table,CellSet set)
{
//WriteToDB
//Edit: This statement will write to hbase db in hdinsight asynchroniously!
await hbase.StoreCellsAsync(TableName, set);
}
如果由于某些奇怪的原因,您无法使用TPL,则必须重构代码并编写自己的线程调度程序:
>您不必每次都为您的写入创建线程,您可以重用它们.
>通常,在同一个线程中第二次运行比为每个操作创建两个不同的线程更快.
>将文件拆分成一些部分,为写入创建线程,并在循环中写入数据.
本文标题为:c# – 使用线程时出现内存不足异常


基础教程推荐
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- C#中 Json 序列化去掉null值的方法 2022-11-18
- Unity shader实现高斯模糊效果 2023-01-16
- C#中的Linq to JSON操作详解 2023-06-08
- C# 解析XML和反序列化的示例 2023-04-14
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- 实例详解C#实现http不同方法的请求 2022-12-26
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#调用摄像头实现拍照功能的示例代码 2023-03-09