Раньше я задавал вопрос о создании перетасованного диапазона - вместо того, чтобы создавать список чисел и затем перетасовывать их, мне нужна была функция, которая могла бы итеративно возвращать список перетасованных чисел без затрат памяти O (n):
Генерация перемешанного диапазона с использованием PRNG вместо перемешивания
Если вы создаете какой-то индекс для своего файла на диске, вы можете создать перетасованную версию, не платя за память, что может быть важно для очень больших файлов. Для индекса я предлагаю что-нибудь простое, например, плоский поток позиций (как 32- или 64-битные целые числа) начала каждой строки. Таким образом, чтобы извлечь N-ю строку из текстового файла, вы можете просто выполнить поиск в потоке индекса до N * 4 (или N * 8 для 64-битных индексов), чтобы определить смещение начала строки, а затем выполнить поиск эту позицию в потоке текстового файла и зачитайте строку.
Используя этот подход, вы можете перемешивать очень большие файлы, не тратя на это затраты в памяти. Конечно, перетасовка будет означать случайное извлечение строк из исходного файла, что не будет столь же эффективным, как сортировка в памяти, если только файл не очень маленький (помещается в кеш почти при первом доступе) или очень большой (в этом случае происходит переполнение памяти. будет хуже, чем случайный поиск), или, возможно, если вы не используете механический жесткий диск (например, SSD).
Для вашей ситуации 10К - это действительно небольшое число. Что-то в районе 10 миллионов строк, возможно, попадающее в несколько гигабайт текста (в зависимости от длины строки, конечно), будет намного сложнее, и именно здесь этот подход (или что-то подобное) будет необходим в 32-битной среде.
person
Barry Kelly
schedule
21.10.2009