링크를 단축하고있는 서비스에 대한 짧은 코드를 미리 생성하고 있습니다. 그것은 일반적인 링크 단축키가 아니므로 선반을 벗어날 수는 없습니다. 초당 약 1000 개의 단축 줄을 처리해야하기 때문입니다.짧은 링크 충돌을 처리하기위한 가장 빠른 C# 구현
링크를 빠르게 생성하기 위해 조회 테이블에 200,000 개의 짧은 링크를 추가하기 위해 12 시간마다 실행되는 서비스가 있습니다.
짧은 링크 테이블이 길어지면 요청하는 짧은 링크에 대한 요구 사항을 따라 잡을 수 없을 정도로 서비스가 더 오래 걸립니다.
단축 링크는 1.8M 행입니다. 우리는 우리가 다 떨어지기 전에 남은 280k 링크가 있습니다. 그리고 지금 200k 링크를 생성하는 데 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();
linq-to-sql을 아직 사용하지 않았지만 데이터베이스의 모든 링크를 가져 오는 것처럼 보입니다. 맞습니까? 어쩌면 단일 링크를 삽입하는 데 사용하는 실제 코드를 보는 데 도움이 될 수 있습니다. – dbemerlin
어떤 목록 구현은 currentCodes입니까? Contains는 ArrayList에 비교적 비싸지 (O (n)) 있습니다. 아마도 해시 테이블을 사용하여 O (1)을 포함 할 수 있습니까? –
나는 당신의 논리를 조금 뒤집어서 어떤 속도로 빠져 나오는지 궁금 할 것이다. 새 코드를 생성 한 다음 카운트 쿼리를 수행하여 새 코드가 이미 있는지 확인하십시오. 나는 이것이 더 빠를 것이라고 생각하지만, 얼마나 빨랐는지 잘 모르겠습니다. – CodingGorilla