Я занимаюсь разработкой приложения, которое использует очень большие справочные таблицы для ускорения математических вычислений. Самая большая из этих таблиц - int [], в которой содержится ~ 10 миллионов записей. Не все таблицы поиска являются int []. Например, один из них - словарь с ~ 200 000 записей. В настоящее время я генерирую каждую таблицу поиска один раз (это занимает несколько минут) и сериализую ее на диск (со сжатием), используя следующий фрагмент:
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");
...
где десериализация определяется как:
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, но его удаление заняло всего несколько сотен миллисекунд из процедур сериализации / десериализации.
Кто-нибудь может предложить способ ускорить время загрузки этих справочных таблиц при первом запуске приложения?