繁体   English   中英

使用线程时内存不足异常

[英]Out of memory exception while using threads

我有以下算法,

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的数据,但在此之后它无法说出Out of 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并可以对服务器上的资源进行调平。

另外,我看到你正在使用微软的HBase客户端, 它有async方法

public async Task StoreCellsAsync(string table, CellSet cells)
{
}

因此,您可以在代码 TPL中同时使用异步方法

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 ,则必须重构代码并编写自己的线程调度程序:

  1. 您不必每次都为您的写入创建线程,您可以重用它们。
  2. 通常,在同一个线程中第二次运行比为每个操作创建两个不同的线程更快。
  3. 将文件拆分成一些部分,为写入创建线程,并在循环中写入数据。

而不是每次都使用ThreadPool.QueueUserWorkItem创建新的Thread。 有关参考,请参阅: https ://msdn.microsoft.com/en-us/library/kbf0f1ct( v = vs.110).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM