[英]C# exception OutOfMemory
我需要一些幫助來處理該異常:
StackTrace : at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.Configuration.GetSection(String sectionName)
at System.Configuration.ClientSettingsStore.GetConfigSection(Configuration config, String sectionName, Boolean declare)
at System.Configuration.ClientSettingsStore.WriteSettings(String sectionName, Boolean isRoaming, IDictionary newSettings)
at System.Configuration.LocalFileSettingsProvider.SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection values)
at System.Configuration.SettingsBase.SaveCore()
at System.Configuration.SettingsBase.Save()
at System.Configuration.ApplicationSettingsBase.Save()
at BayesianSpamFilter.MainWindow.SaveSettings()
這就是我在做什么:
string percentG = Properties.Settings.Default.PercentG;
string percentB = Properties.Settings.Default.PercentB;
string percentR = Properties.Settings.Default.PercentR;
string percentF = Properties.Settings.Default.PercentF;
string spamDbM = Properties.Settings.Default.SpamDbM;
string spamDbS = Properties.Settings.Default.SpamDbS;
string hamDbM = Properties.Settings.Default.HamDbM;
string hamDbS = Properties.Settings.Default.HamDbS;
private void SaveSettings()
{
percentG = JsonConvert.SerializeObject(spamPercentageGraham);
Properties.Settings.Default.PercentG = percentG;
percentB = JsonConvert.SerializeObject(spamPercentageBurton);
Properties.Settings.Default.PercentB = percentB;
percentR = JsonConvert.SerializeObject(spamPercentageRobinson);
Properties.Settings.Default.PercentR = percentR;
percentF = JsonConvert.SerializeObject(spamPercentageFisher);
Properties.Settings.Default.PercentF = percentF;
spamDbM = JsonConvert.SerializeObject(spamDatabaseMulti);
Properties.Settings.Default.SpamDbM = spamDbM;
spamDbS = JsonConvert.SerializeObject(spamDatabaseSingles);
Properties.Settings.Default.SpamDbS = spamDbS;
hamDbM = JsonConvert.SerializeObject(hamDatabaseMulti);
Properties.Settings.Default.HamDbM = hamDbM;
hamDbS = JsonConvert.SerializeObject(hamDatabaseSingles);
Properties.Settings.Default.HamDbS = hamDbS;
Properties.Settings.Default.Save();
}
private void LoadSettings()
{
spamPercentageGraham = JsonConvert.DeserializeObject<Dictionary<string, double>>(percentG);
spamPercentageBurton = JsonConvert.DeserializeObject<Dictionary<string, double>>(percentB);
spamPercentageRobinson = JsonConvert.DeserializeObject<Dictionary<string, double>>(percentR);
spamPercentageFisher = JsonConvert.DeserializeObject<Dictionary<string, double>>(percentF);
spamDatabaseMulti = JsonConvert.DeserializeObject<Dictionary<string, int>>(spamDbM);
spamDatabaseSingles = JsonConvert.DeserializeObject<Dictionary<string, int>>(spamDbS);
hamDatabaseMulti = JsonConvert.DeserializeObject<Dictionary<string, int>>(hamDbM);
hamDatabaseSingles = JsonConvert.DeserializeObject<Dictionary<string, int>>(hamDbS);
}
另外:每個詞典的Count()
約為300k。 我沒有用完物理內存,也沒有用完RAM。.我正在用這些詞典計算許多不同的事物,所以我需要所有這些。
嘗試將應用程序的體系結構設置為64位。 然后,您的應用程序應該能夠分配更多的內存!
需要考慮的幾件事。
您要定位的體系結構(32位/ 64位)。 就像已經回答了這個答案一樣,如果可以的話,請嘗試為64位平台進行編譯。 無論您的計算機有多少RAM,32位.NET進程都限於2 GB。
您可以通過在Build → Configuration Manager → 活動解決方案平台 → New…中創建64位配置來完成此操作。
當然,這要求您不要在32位計算機上開發或運行程序。
即使上述選項是一種選擇,我認為您還是可以考慮是否可以更改應用程序設計(或更准確地說,如何保存數據的方式):
您需要存儲所有這些數據,還是需要一個子集存儲? 有什么方法可以減少必須保存的數據? 例如,是否可以通過應用某些固定規則從其他數據派生某些數據,這樣您就只需要存儲后一種數據即可?
您能否將數據持久保存到Web / App.config以外的其他文件中? (此外:不應濫用當前使用的設置存儲機制來存儲任何類型的數據。)如果使用其他存儲機制(例如每個詞典一個文件)來保存字典,則可以...
序列化並持久保存一個字典,一次又一次。 這可能使您可以盡早處理不再需要的字典(及其序列化表示形式),而您一次只需要在內存中保留一個序列化輸出即可。 這可能會減輕內存壓力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.