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