Я предварительно генерирую короткие коды для создаваемой мной службы, которая сокращает ссылки. Это не обычное средство сокращения ссылок, поэтому я не могу использовать его с полки, поскольку нам нужно обрабатывать почти 1000 сокращений в секунду.
У меня есть служба, которая запускается каждые 12 часов, чтобы добавить еще 200 000 коротких ссылок в таблицу поиска для быстрой генерации ссылок.
Поскольку таблица коротких ссылок становится длиннее, обслуживание занимает все больше и больше времени, до такой степени, что мы не можем удовлетворить спрос на короткие ссылки.
Таблица сокращенных ссылок - 1.8M строк. У нас осталось 280 тысяч ссылок, прежде чем мы закончили. И теперь генерация 200 тыс. Ссылок занимает более 1 часа.
Я, очевидно, делаю что-то не так, возможно, тот факт, что я использую только List<string>
для сравнения. Ниже приведен блок кода:
Stopwatch sw = Stopwatch.StartNew();
LtsDataContext ldc = new LtsDataContext();
List<string> currentCodes = ldc.ShortUrls.Select(s => s.ShortCode).ToList();
currentCodes =
currentCodes.Union(ldc.FastShortCodes.Select(s => s.ShortCode)).ToList();
int count = args.Length > 0 ? int.Parse(args[0]) : 200000;
List<string> newCodes = new List<string>(count);
for (int i = 0; i < count; i++)
{
string newCode = Guid.NewGuid().ToString("N").Substring(0, 8);
while (currentCodes.Contains(newCode) || newCodes.Contains(newCode))
newCode = Guid.NewGuid().ToString("N").Substring(0, 8);
newCodes.Add(newCode);
}
ldc.FastShortCodes.InsertAllOnSubmit(newCodes.Select(s =>
new FastShortCode() { ShortCode = s }));
ldc.SubmitChanges();
Console.Write((decimal)sw.ElapsedMilliseconds / (decimal)1000);
Console.ReadKey();