Я разрабатываю приложение, которое использует очень большие таблицы поиска для ускорения математических вычислений. Самая большая из этих таблиц — 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");
...
где 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, но его удаление сократило лишь несколько сотен миллисекунд из подпрограмм сериализации/десериализации.
Может ли кто-нибудь предложить способ ускорить время загрузки этих таблиц поиска при первоначальном запуске приложения?