@kaka888
C, C++, Qt, Python Flask, MySQL, Lua

Как быстро получить случайное слово из файла на 12 ГиБ?

Имеется файл на 12 ГиБ, содержащий по одному слову на каждой строке. Разные слова разной длины (от нескольких символов до нескольких десятков). Надо постоянно получать случайное слово из этого набора. Вариант загрузки файла целиком в память, в список, например, не подходит, т.к. это займёт слишком много памяти, да и придётся ждать несколько минут при каждом запуске программы.
Мне в голову пришёл вариант проиндексировать все строки файла (или несколько строк по всему файлу), т.е. хранить в памяти пары (<номер строки>, <смещение относительно начала файла>) и с помощью них ускорять чтение строки с нужным номером из файла.
Можно ли средствами стандартной библиотеки Python облегчить оптимизацию этого процесса?
Или кто-нибудь знает как решить это проще?
  • Вопрос задан
  • 511 просмотров
Решения вопроса 2
@dima20155
you don't choose c++. It chooses you
Вариант с потолка: генерируйте случайную позиции в файле (от нуля до размера файла в байтах). Читаете все окружающие символы пока не найдете два символа новой строки ('\n') до и после исходной случайной позиции. Между этими символами новой строки и будет ваше случайное слово.

Рандом, конечно же, не совсем честный и сильно зависит от различия в длинах строк в файле.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Какая максимальная длина слова? Ну допустим 20 символов.

Не в курсе насчет питона. Но я-бы убрал фактор плавающей длины. Например я-бы разбил
этот 12Гб файл на 20 файлов. Допустим в первом будут лежать все слова длиной в 1 символ.
Во втором 2 символа. И так далее.

Тогда формула будет такая. Считаем распределение слов по этим 20 файлам. Там гистограмма получается.
Типа допустим 5% на 8 символьные слова. 8% на 9 символьные и так далее. Выбираем случайный файл
ну как-бы учитывая "перекос". И потом уже внутри этого файла просто ищем случайное слово. Будет
быстро потому-что слова уже имеют фиксированную длину.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
По мне, так проще всего импортировать как CSV в СУБД в таблицу с первичным ключом bigint и колонкой типа строка.
Зная общее количество записей, просто берем случайное число в диапазоне 1..count и с SQL ищем запись под этим первичным ключом.
Тогда ничего мудрить и не нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы