Кто-то намекнул на возможный способ индексирования этой вещи, если у вас достаточно ОЗУ (или, возможно, даже диск / своп).
Представьте, что вы выполнили простую 32-битную CRC для блока размером 1 КБ, начиная с каждого символа в исходной строке Gig. Это приведет к получению 4 байтов данных контрольной суммы для каждого байтового смещения от начала данных.
Само по себе это может дать незначительное улучшение скорости поиска. Контрольная сумма каждой цели поиска 1K может быть проверена по каждому CRC ... который каждое столкновение проверялось на истинное совпадение. Это все равно должно быть на пару порядков быстрее, чем при обычном линейном поиске.
Это, очевидно, стоит нам 4 ГБ ОЗУ для массива CRC (плюс исходный гигабайт для исходных данных и немного больше накладных расходов для среды и нашей программы).
Если у нас есть ~ 16 ГБ, мы могли бы отсортировать контрольные суммы и сохранить список смещений, где они найдены. Это становится индексированным поиском (в среднем около 16 проверок на целевой поиск ... в худшем случае около 32 или 33 (возможно, там есть ограждение).
Вполне возможно, что индекс файла 16BG все равно даст лучшую производительность, чем поиск по линейной контрольной сумме, и он почти наверняка будет лучше, чем линейный необработанный поиск (если у вас нет чрезвычайно медленных файловых систем / хранилища).
(Добавление): Я должен уточнить, что эта стратегия выгодна только с учетом того, что вы описали необходимость выполнять много операций поиска на одном и том же гигабайте данных.
Вы можете использовать многопоточный подход к созданию индекса (при его чтении, а также при наличии нескольких потоков, выполняющих контрольную сумму). Вы также можете перенести индексирование в отдельные процессы или кластер узлов (особенно если вы используете индекс на основе файлов - параметр ~ 16GB, описанный выше). С помощью простого 32-разрядного CRC вы можете выполнять контрольные суммы / индексирование так быстро, как ваш читательский поток может получить данные (но мы говорим о 1024 контрольных суммах для каждого 1 КБ данных, поэтому, возможно, нет).
Вы можете еще больше повысить производительность, кодируя модуль Python в C для фактического выполнения поиска ... и / или, возможно, для выполнения контрольной суммы / индексации.
Разработка и тестирование таких расширений C влекут за собой другие компромиссы, очевидно, достаточно. Похоже, это будет иметь практически нулевое повторное использование.