Вы можете сделать второй файл, который содержит записи, каждая запись является 64-битной CRC плюс смещение строки и файл должен быть проиндексирован для быстрого поиска.Примерно так:
ReadFromSourceAndSort()
{
offset=0;
while(!EOF)
{
string = ReadFromFile();
crc64 = crc64(string);
if(lookUpInCache(crc64))
{
skip;
} else {
WriteToCacheFile(crc64, offset);
WriteToOutput(string);
}
}
}
Как сделать хороший кеш-файл?Должен быть отсортирован по CRC64 для быстрого поиска.Таким образом, вы должны сделать структуру этого файла похожей на двоичное дерево поиска, но с быстрым добавлением новых элементов без перемещения существующих в файле.Для повышения скорости необходимо использовать Файлы с отображением в памяти .
Возможный ответ:
memory = ReserveMemory(100 Mb);
mapfile= MapMemoryToFile(memory, "\\temp\\map.tmp"); (File can be bigger, Mapping is just window)
currentWindowNumber = 0;
while(!EndOfFile)
{
ReadFromSourceAndSort(); But only for first 100 Mb in memory
currentWindowNumber++;
MoveMapping(currentWindowNumber)
}
и функция для поиска;Не следует использовать отображение (поскольку каждое переключение окна сохраняет 100 МБ на жесткий диск и загружает 100 МБ следующего окна).Просто ищет в 100 Мб деревьях CRC64, и если CRC64 найден -> строка уже сохранена