我正在开发一个应用程序,它利用非常大的查找表来加速数学计算。这些表中最大的是一个 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 压缩导致速度变慢,但从序列化/反序列化例程中删除它只需要几百毫秒。
任何人都可以建议在应用程序初始启动时加快这些查找表的加载时间的方法吗?