首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >体育数据库的读取

体育数据库的读取
EN

Code Review用户
提问于 2016-01-04 20:59:59
回答 2查看 245关注 0票数 1

我需要阅读包含44-50个表的数据库,总共大约有500万个条目(每个表大约有100 k个条目)。

这些数据包括运动中的位置跟踪数据(运动员、裁判和球)和比赛项目(投篮、比赛、铲球、.):

比赛项目在性能上可以忽略不计。

桌子: PlayerXYZ或Ball

现在,读取数据库并将内容分配给DataTable字典需要86秒钟。那是每秒57000个条目的“速度”。

代码语言:javascript
复制
private async void ProcessLoadMatch()
{
    var window = Application.Current.MainWindow as MetroWindow;
    var controller = await window.ShowProgressAsync("Please wait...", "Process message", false, new MetroDialogSettings());

    controller.SetTitle("Loading Match-Data...");
    await Task.Run(() => HandleLoadMatch(controller));
    await controller.CloseAsync();


}

static bool HandleLoadMatch(ProgressDialogController ProgCtrl)
{
    string DataBasePath = @"W:\data\sqlite";
    string DataBaseName = "db";
    string dbpath = @DataBasePath + @"\" + @DataBaseName + ".sqlite";

    SQLiteConnection con = new SQLiteConnection("Data Source=" + dbpath + ";Version=3;");
    con.Open();

    DataTable tables = con.GetSchema("Tables");
    double currentTable = 0;
    double Percentage = 0;
    foreach (DataRow row in tables.Rows)
    {
        currentTable++;
        Percentage = (100 / tables.Rows.Count) * currentTable; 
        string tablename = (string)row[2];
        ProgCtrl.SetMessage("Loading Data\nCurrent Table ("+currentTable+" of "+tables.Rows.Count+"): " + tablename + " ...");
        ProgCtrl.SetProgress(Percentage / 100);

        string CmdString = "SELECT * FROM " + tablename;
        SQLiteCommand cmd = new SQLiteCommand(CmdString, con);
        SQLiteDataAdapter sda = new SQLiteDataAdapter(cmd);
        DataTable MatchDt = new DataTable();
        sda.Fill(MatchDt);

        CurrentDataSet.CurrentMatch.Data.Add(tablename, MatchDt);
    }
    con.Close();
    return true;

}

CurrentDataSet.CurrentMatch.Data

代码语言:javascript
复制
class CurrentMatch
{
    public static Dictionary<string, DataTable> Data = new Dictionary<string, DataTable>();
}

我的系统:

  • Mac Mini (2012年底)
  • i5-3210m克隆
  • 16 RAM
  • 256 SSD

我的代码中是否还有任何性能潜力?我定期加载不同的数据库,因此如果有显著的性能提高,我们将不胜感激。

EN

回答 2

Code Review用户

发布于 2016-10-31 12:29:02

只是一些想法..。

  • 我不使用数据表和数据集,而是尝试使用POCO和数据读取器。这绝对是更友好的linq。也许装得更快。
  • 您可以尝试并行加载这些表--我怀疑单个表会使SSD达到极限。
  • 所有SQLite对象都需要被释放。
  • 您的命名约定非常需要改进-许多缩写和混合大小写。
  • return true是不必要的。无论如何,该方法都不会返回false。最好是void
票数 2
EN

Code Review用户

发布于 2016-11-07 22:04:53

你的方法很简单。从所有表加载所有记录。它基本上意味着加载整个数据库。为了获得更好的表现,问问自己:

  • 我的应用程序真的需要在一开始就加载所有db表吗?
  • 我的应用程序真的需要一次加载整个表记录吗?

如果答案是否定的,请考虑另一种方法:

  • 在需要时加载数据。在开始时删除一些表。
  • 通过SQL限制记录,或者更好地实现一些ORM (例如PetaPoco),并且只获取所需的记录。
  • 考虑在本地缓存数据库记录(例如,缓存不可变的旧记录)。

您还可以尝试使用内存中数据库方法。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/116472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档