У меня есть несколько "маленьких" текстовых файлов, которые содержат около 500000 записей/строк. Каждая строка имеет также "ключевой" столбец. Мне нужно найти эти ключи в большом файле (8 ГБ, по крайней мере, 219 миллионов записей). Когда это найдено, мне нужно добавить "Значение" из большого файла в маленький файл, в конце строки в качестве нового столбца.
Большой файл, который выглядит следующим образом:
KEY VALUE
"WP_000000298.1" "abc"
"WP_000000304.1" "xyz"
"WP_000000307.1" "random"
"WP_000000307.1" "text"
"WP_000000308.1" "stuff"
"WP_000000400.1" "stuffy"
Проще говоря, мне нужно найти "ключ" в большом файле.
Очевидно, мне нужно загрузить всю таблицу в ОЗУ (но это не проблема, у меня есть 32 ГБ). Большой файл, похоже, уже отсортирован. Я должен проверить это.
Проблема в том, что я не могу выполнить быстрый поиск, используя что-то вроде TDictionary, потому что, как видите, ключ не уникален.
Примечание. Это, вероятно, одноразовый расчет. Я буду использовать программу один раз, а затем выбросить ее. Таким образом, он не должен быть алгоритмом BEST (сложным для реализации). Это просто нужно закончить в приличное время (например, 1-2 дня). PS: Я предпочитаю делать это без БД.
Я думал об этом возможном решении: TList.BinarySearch. Но, похоже, TList ограничивается только 134 217 727 (MaxInt div 16). Так что TList не будет работать.
Вывод:
Я выбираю решение Арно Буше. Его TDynArray впечатляет! Я полностью рекомендую его, если вам нужно обработать большие файлы.
АлексейХарланов предоставил еще одно приятное решение, но TDynArray уже реализован.