[英]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
,則必須重構代碼並編寫自己的線程調度程序:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.