Вставьте каждое целое число в один из пулов 2 n Базы данных SQLite (2 8 , вероятно, хорошее число), выбранных путем вычисления n -битный хэш целого числа. Сделайте один столбец одной таблицы первичным ключом, чтобы попытка вставить существующее число не удалась.
Предполагая, что целые числа уже достаточно случайны, вы, вероятно, можете просто выбрать, скажем, наименее значимый байт в качестве "хеша".
РЕДАКТИРОВАТЬ: я сделал некоторые испытания. Я вставил 25 миллионов записей примерно за два часа, но он сожрал более 1 ГБ в процессе. Это делается путем генерации случайных чисел и распределения их по 32 подпроцессам, каждый с одной базой данных SQLite под своим контролем и фиксирует один раз каждые 100 000 вставок. В настоящее время вставки работают с частотой 1350 Гц, что намного превышает 3 Гц, которые требуются для вашей проблемы, но вся база данных по-прежнему помещается в кэш (у меня 8 ГБ ОЗУ). Я не буду знать производительность в стационарном режиме, если я не приблизюсь к вашему текущему размеру базы данных В этот момент каждая вставка будет вызывать как минимум четыре движения головки диска (чтение и запись индекса и таблицы, возможно, больше, чтобы углубиться в дерево B +), и тогда вы будете знать, сколько боли вы действительно переживаете .
Я начинаю думать, что это действительно интересная проблема, которая может быть решена гораздо эффективнее с помощью решения, разработанного по заказу. Тем не менее, я подозреваю, что потребуется значительное усилие, чтобы значительно превзойти ядро базы данных.