Я собираюсь предположить, что на полмиллиона слов вы означаете, что ваш файл составляет около 5 ГБ.
Если это так, вы действительно не хотите читать все это в памяти. Я имею в виду, конечно, все это будет технически вписываться в ОЗУ многих компьютеров (хотя, конечно, не все), но для этого также потребуется некоторое время. С SSD это займет около 10 секунд, что, я думаю, в порядке, в зависимости от вашего приложения, это может быть на 100% лучше, но это, конечно, не быстро для стандартного настольного приложения. Однако, если вы читаете его с жесткого диска, это займет 60 секунд. И это предполагает, что ваш жесткий диск не фрагментировал файл, если это так, он будет еще медленнее.
Обе ситуации являются идеальным минимумом, и на практике загрузка файла размером 5 ГБ полностью в ОЗУ будет в лучшем случае медленной. (Хотя в некоторых очень редких случаях это то, что вы хотите, как правило, когда вы делаете высокопроизводительные вычислительные материалы.)
Лучшая идея, как предлагалось @Carcigenicate, - это вместо этого потоковое перемещение файла в вашу программу лениво, вам не нужно иметь длительную паузу. Для этого я рекомендую либо in-input-port-bytes
, либо in-bytes-lines
. Они оба генерируют потоки, которые затем можно использовать для обработки ваших данных, где первый из них дает вам по одному байту за раз, а другой дает вам одну строку байтов за раз. И до тех пор, пока вы не достигнете EOF. Вы можете сделать это в for
(call-with-input-file "file.txt"
(lambda (f)
(for/fold ([counter 0])
([i (in-input-port-bytes f)])
(+ counter 1))
Приведенный выше пример является медленным способом вычислить количество байтов в файле. Но это показывает, как вы можете использовать in-input-port-bytes
.
Есть и другие функции, чтобы создать поток символов, а не байт из файла: in-lines
, read-port
и т.д.
Вы, вероятно, должны читать его лениво. Вам действительно нужен весь файл в памяти сразу? – Carcigenicate