메모리가 부족한 프로그램이 있습니다. 내가 "처리"되었을 때 object = null
을 설정하는 이유를 이해할 수 없습니다.C# 프로그램 메모리가 부족합니다.
foreach (DataRow theRow in thisDataSet.Tables["Collection"].Rows)
{
LS_BatchAID = Convert.ToString(theRow["BatchAID"]);
LS_Batch = Convert.ToString(theRow["Batch"]);
LS_ID = Convert.ToString(theRow["ID"]);
CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch);
Batch = null;
}
thisConnection.Close();
내가이 오류를 얻을 : 프로그램을 실행하고 윈도우 작업 관리자를 보면서 System.OutOfMemoryException이 '가 mscorlib.dll 에서 발생, 나는 코드의 반복 횟수에 대응 선형 메모리 소비 상승을 볼 수 있습니다.
어떻게 메모리 소비/덤프를 증가시키지 않는 프로그램을 만들겠습니까?
CL_Batch:
class CL_Batch
{
private string BatchAID;
private string ID;
private string Batch;
private string pathPDF;
private string pathCPR;
private string pathLog;
private string DateXMLGenerated;
private string[] IDType;
private string[,] IDTypes;
private string[] Files;
private DateTime Dates;
private byte[] pdfContent;
private string XMLContent;
private string[] RefNbr;
public CL_Batch(string IV_BatchAID, string IV_ID, string IV_Batch)
{
this.Dates = DateTime.Now;
this.DatoXMLGenerated = "" + Dato.Date.Year.ToString() + "-" + BuildNumber(true, 2, Dato.Date.Month.ToString()) + "-" + BuildNumber(true, 2, Dato.Date.Day.ToString()) + "";
this.BatchAID = IV_BatchAID;
this.ID = IV_ID;
this.Batch = IV_Batch;
this.pathPDF = @"C:\path\TempFiles\path\" + this.ID + ".Pdf";
this.pathCPR = @"C:\path\TempFiles\";
this.pathLog = @"C:\path\Log\" + this.Batch + ".txt";
setRefnbr();
// Set array with mappings of ID between partners.
setLegitimationsTyper();
// ensure log is available ([NameOfLog]).
prepareLog();
// Find all files for archive.
getFileNames();
// Move files C:\path\TempFiles\
if (this.getFiles() == true)
{
// Create PDF's.
makePDF();
// Insert PDF's in database.
insertPDF();
// Create XML files.
makeXML();
// Insertt XML in database.
insertXML();
}
public string getBatchAID()
{
return this.BatchAID;
}
public string getID()
{
return this.ID;
}
public string getBatch()
{
return this.Batch;
}
public string getIDTyper(string IV_Code, bool kode)
{
for (int i = 0; i <= this.IDTypes.GetUpperBound(0); i++)
{
if (this.IDTypes[i, 0] == IV_Kode)
{
if (Code == true)
{
return this.LegitimationsTyper[i, 1];
}
else
{
return this.LegitimationsTyper[i, 2];
}
}
}
return "";
}
}
/******************************************/
/** UPDATE # 1 **************************/
충분히페어! 생성자의 남용. 나는 요점을 얻는다. -하지만 : 정말 어떤 문제가 있습니까?
이미이 예를 대하신대로 내가 할 경우
CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch);
Batch.setRefnbr();
Batch.setIDTypes();
Batch.prepareLog();
Batch.getFileNames();
Batch.makePDF();
Batch.insertPDF();
Batch.makeXML();
Batch.insertXML();
Batch = null;
그리고 실제 차이는 무엇인가? 몇 가지 숫자를 추가하는 방법이 다른 경우 동일한 지침으로 끝납니다.
First program:
xor ax, ax
mov ax, 10
add ax, 10
Second program:
xor ax, ax
mov ax, 10
add ax, 10
나는 그것이 결국에는 차이가 없다 볼 수있는 방법은 (내가 OOP의 개념을 오용하는 것을 정찰하지만, 최종 생성물 인은 동일합니다 - 내가 예상)
나에게 조언을 내 망상에 관한하세요 .
미리 감사드립니다. /** 업데이트 # 1/ /**************************************** **/
입니다 :
이 작동 코드는? – BugFinder
스 니펫을 'foreach'로 축소하는 것은 우리에게 발생하는 노이즈를 최소화하는 방법이 아닙니다. 전체 클래스의 노이즈를 줄이고이 감소 된 클래스를 보여 주면 좋을 것입니다. 귀하의 foreach 루프에 없습니다 –
귀하의 문제는 귀하의 메모리에있는 문자열의 양을 주위에있을 수 있다고 생각하지만, 실제 대답을 찾을 수 dotMemory 또는 이와 유사한를 사용해야합니다 –