优化加载内存中的数据

时间:2015-08-03 14:23:53

标签: c# memory optimization encryption windows-embedded-compact

我需要将SQLite中的数据加载到内存中,当表包含超过40k的条目时,此过程会持续几分钟。 db中的数据已加密,因此我将其解密以加载到内存中。

基本上,我是:

  • 加载表中的所有数据
  • 在阅读时我解密了信息并将其添加到词典

代码:

internal static void LoadInfo(Dictionary<int, InfoMemory> dic)
{
    using (SQLiteConnection con = new SQLiteConnection(conString))
    {
        using (SQLiteCommand cmd = con.CreateCommand())
        {
            cmd.CommandText = String.Format("SELECT ID, Version, Code FROM Employee;");

            int ID, version, code;

            try
            {
                con.Open();
                using (SQLiteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        try { ID = Convert.ToInt32(Decrypt(rdr[0].ToString())); }
                        catch { ID = -1; }
                        try { version = Convert.ToInt32(Decrypt(rdr[1].ToString())); }
                        catch { version = -1; }
                        try { code = Convert.ToInt32(Decrypt(rdr[2].ToString())); }
                        catch { code = -1; }

                        if (ID != -1)
                        {
                            if (!dic.ContainsKey(ID)) dic.Add(ID, new InfoMemory(version, code));
                        }
                    }
                    rdr.Close();
                }
            }
            catch (Exception ex) { Log.Error(ex.Message); }

            finally { con.Close(); GC.Collect(); }
        }
    }
}

如何更快地完成此过程? 我尝试的一种方法是将加密数据加载到内存并在需要时解密,但如果我这样做,我会消耗更多内存。由于我在移动设备上工作,我希望尽可能降低内存消耗。

1 个答案:

答案 0 :(得分:1)

你可以做的一件事是;而不是使用try / catch:

int id, version, code;

if(!int.TryParse(rdr[0], out id))
{
    id = -1;
}

if(!int.TryParse(rdr[1], out version))
{
    version = -1;
}

if(!int.TryParse(rdr[2], out code)) 
{
    code = -1;
}