非常に大きなルックアップ テーブルを使用して数学的計算を高速化するアプリを開発しています。これらのテーブルの最大のものは、約 1,000 万のエントリを持つ int[] です。すべてのルックアップ テーブルが int[] であるわけではありません。たとえば、1 つは ~200,000 エントリの辞書です。現在、各ルックアップ テーブルを 1 回 (数分かかります) 生成し、次のスニペットを使用して (圧縮して) ディスクにシリアル化します。
int[] lut = GenerateLUT();
lut.Serialize("lut");
Serialize は次のように定義されます。
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");
...
ここで、Deserialize は次のように定義されます。
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 圧縮ではないかと考えていましたが、それを削除してもシリアライゼーション/デシリアライゼーション ルーチンから数百ミリ秒しかスキミングされませんでした。
アプリの初回起動時にこれらのルックアップ テーブルの読み込み時間を短縮する方法を提案できる人はいますか?