我写了一些代码来序列化包含一些数据的对象,保存它,然后在下次运行程序时加载它。 (使用BinaryFormater)
然而,该程序需要花费很长时间来实际加载数据(在100次托管时,大约需要15-30秒),而且我需要该文件以大约300,000次托管存储更多内容。节省时间也不是很好,但加载速度要快得多。我想知道保存和加载数据库有哪些选项以及它们之间的区别。我已经读过Xml非常慢,我也想知道延迟加载是如何工作的(只根据需要加载),以及它可以应用的文件格式。
以下是保存并重新填充数据的代码:
static void SaveAsBinary(string fullpath, object data)
{
// Create the new, empty data file.
string fileName = fullpath;
if (File.Exists(fileName))
{
Console.WriteLine(fileName + @" already exists!");
if (File.Exists(fileName + ".bak"))
{ File.Delete(fileName + ".bak"); }
File.Move(fileName, fileName + ".bak");
}
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(fileName, FileMode.CreateNew);
bf.Serialize(fs, data);
fs.Flush(true);
fs.Dispose();
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
private void PopulateDatabase(SaveDatabaseIndex db)
{
if (last_page < cur_page) db.current_page = -1;
db.UrlList = UrlList;
db.firstentryOnSave = firstentryOnload;
foreach (string url in UrlList)
{
eh_entry ent = getEntry(url);
details_PaneSaveData detpane = new details_PaneSaveData
{
rating = ent.detailspanel.rating,
uploader = ent.detailspanel.uploader,
category = ent.detailspanel.category,
date = ent.detailspanel.date,
filecount = ent.detailspanel.filecount,
filesize = ent.detailspanel.filesize,
tags = ent.detailspanel.tags
};
eh_entrySave entSaveData = new eh_entrySave
{
dl_location = ent.dl_location,
files = ent.file,
title = ent.title,
detail_SaveData = detpane
};
db.eh_Save.Add(url, entSaveData);
}
SaveAsBinary(Application.StartupPath + "\\" + db.db_name + ".dat", db);
}
public void LoadDataBase(string DatabasePath)
{
SaveDatabaseIndex LoadedData = LoadAsBinary(DatabasePath) as SaveDatabaseIndex;
//Populate Required Objects with Loaded Data
if (LoadedData != null)
{
cur_page = LoadedData.current_page;
firstentryOnload = LoadedData.firstentryOnSave;
UrlList = LoadedData.UrlList;
Parallel.ForEach(UrlList, entUrl =>
{
eh_entrySave ent_Save = LoadedData.eh_Save[entUrl] as eh_entrySave;
HTEntry.Add(entUrl, new eh_entry
{
detailspanel = new details_Pane
{
rating = ent_Save.detail_SaveData.rating,
uploader = ent_Save.detail_SaveData.uploader,
category = ent_Save.detail_SaveData.category,
date = ent_Save.detail_SaveData.date,
filecount = ent_Save.detail_SaveData.filecount,
filesize = ent_Save.detail_SaveData.filesize,
tags = ent_Save.detail_SaveData.tags
},
dl_location = ent_Save.dl_location,
title = ent_Save.title
});
});
}
}
static object LoadAsBinary(string fullpath)
{
string fileName = fullpath;
if (File.Exists(fileName))
{
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryFormatter bf = new BinaryFormatter();
var loadedData = bf.Deserialize(fs);
return loadedData;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
else if (File.Exists(fileName + "bak"))
fileName = fileName + "bak";
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryFormatter bf = new BinaryFormatter();
var loadedData = bf.Deserialize(fs);
return loadedData;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
return null;
}
编辑:只是为了澄清我正在寻找一个现有的文件格式或数据库产品,而不是使用二进制序列化。
编辑2:我的问题措辞不是很好,我最终在这里找到了我的问题的答案Which database would you recommend to use with C# (.NET) application?