我正在開發一個應用程序,它利用非常大的查找表來加速數學計算。這些表中最大的是一個int [],它有大約1000萬條記錄。並非所有的查找表都是int []。例如,一個是包含約200,000個條目的字典。目前,我生成每個查找表一次(這需要幾分鐘),並用下面的代碼片斷它序列到磁盤(與壓縮):存儲大型查找表
int[] lut = GenerateLUT();
lut.Serialize("lut");
其中序列化的定義如下:
public static void Serialize(this object obj, string file)
{
using (FileStream stream = File.Open(file, FileMode.Create))
{
using (var gz = new GZipStream(stream, CompressionMode.Compress))
{
var formatter = new BinaryFormatter();
formatter.Serialize(gz, obj);
}
}
}
的我遇到的煩惱是啓動應用程序時,這些查詢表的反序列化時間很長(15秒以上)。這種類型的延遲會令用戶惱火,因爲應用程序將無法使用,直到加載所有查找表爲止。目前,反序列如下:
int[] lut1 = (Dictionary<string, int>) Deserialize("lut1");
int[] lut2 = (int[]) Deserialize("lut2");
...
,其中作爲反序列化的定義:
public static object Deserialize(string file)
{
using (FileStream stream = File.Open(file, FileMode.Open))
{
using (var gz = new GZipStream(stream, CompressionMode.Decompress))
{
var formatter = new BinaryFormatter();
return formatter.Deserialize(gz);
}
}
}
起初,我認爲這也許已經是gzip壓縮是造成增速放緩,但刪除它只有脫脂從序列化/反序列化例程幾百毫秒。
任何人都可以提出一種方法來加快應用程序的初始啓動時這些查詢表的加載時間?
我同意這一點,但它是一種解決辦法還是有點海事組織。關於我的應用程序,gui非常簡單,用戶可以在5秒內完成計算。所以目前,我正在爭取5秒或更少的加載時間(查找表將在不到5秒的時間內加載到後臺)。 – snazzer 2009-07-20 23:59:36