C#我应该如何保存大型信息数据库?

时间:2015-10-31 01:23:30

标签: c# file-io save file-format

我写了一些代码来序列化包含一些数据的对象,保存它,然后在下次运行程序时加载它。 (使用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?

0 个答案:

没有答案
相关问题