Je reçois une 'System.OutOfMemoryException' en essayant de générer des rapports HTML.Refactoring - System.OutOfMemoryException
Comment puis-je le factoriser de manière à ce que ceci soit tamponné dans un fichier, au lieu de le lire en mémoire, puis de l'écrire dans un fichier.
Il y aura plus de 2000 enregistrements dans le datatable, et il manque déjà de mémoire à 2000 lignes.
DétailsUpdateTemplate contient un extrait html multi-ligne. Je suppose que je crée une chaîne qui est trop grande.
J'utilise C#, .NET 3.5
internal static String SaveARSUpdateHTML(DataTable table, string fileName)
{
int recordCount = table.Rows.Count;
Dictionary<String, object> templateCols = new Dictionary<string, object>();
templateCols["Track"] = table.TableName;
templateCols["ProdDate"] = DateTime.Now.ToShortDateString();
templateCols["ProdTime"] = DateTime.Now.ToShortTimeString();
templateCols["TotalRecords"] = recordCount;
String detailOutput = String.Empty;
for (int i = 0; i < table.Rows.Count; i++)
{
int ResultID = i + 1;
DataRow row = table.Rows[i];
String ReportDetails = DetailsUpdateTemplate;
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", "ResultID"), ResultID.ToString());
foreach (DataColumn column in table.Columns)
{
String value = row[column.ColumnName].ToString();
if (column.ColumnName.Equals("TF"))
{
String display = value.Equals("no", StringComparison.CurrentCultureIgnoreCase) ? "none" : "block";
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", "SuppressNewAddr"), display);
}
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", column.ColumnName), value);
}
detailOutput += ReportDetails;
}
templateCols["ReportDetails"] = detailOutput;
String masterOut = MasterUpdateTemplate;
foreach (KeyValuePair<string, object> pair in templateCols)
{
masterOut = masterOut.Replace(String.Format("{{{0}}}", pair.Key), pair.Value.ToString());
}
String outputFile = String.Format("{0}.htm", fileName);
using (StreamWriter sw = new StreamWriter(outputFile))
{
sw.Write(masterOut);
}
return outputFile;
}
Vous n'avez pas fourni la partie pertinente de votre code. Tout ce que fait ce code est de modifier certaines données ** déjà ** en mémoire pour les sauvegarder dans un fichier. 'DataTable' est en mémoire. Donc, au lieu d'utiliser 'DataTable' en utilisant SqlDataReader et de diffuser directement dans le fichier. –
On me transmet un DataTable d'une bibliothèque différente. Je ne peux pas changer le comportement d'entrée. –