簡體   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