Excel VBA не хватает памяти при чтении файла в строку при последующих запусках. Работает первый раз, но не второй - PullRequest
0 голосов
/ 25 февраля 2020

Я работаю над проектом, в котором я собираю данные из больших текстовых файлов, размером от 200 МБ до 1,5 ГБ. Сейчас я тестирую это с файлом размером 200 МБ. Если я использую объект файловой системы и читаю файлы построчно, процесс занимает более часа. Так что, пытаясь ускорить процесс, я обнаружил, что чтение файлов в длинную строку, затем разделение на заданные c заголовки, затем, в свою очередь, разделение каждого индекса этого массива по строкам и итерация по строкам уменьшают общее чтение Время около минуты. Огромный прирост производительности! Проблема в том, что процесс работает только при первом запуске. Любые последующие запуски вызывают ошибку «Run-time error 14»: out of string space ». Исправление заключается в том, чтобы закрыть книгу, а затем снова открыть ее. Тогда это будет работать снова, но только один раз. Чтобы обойти эту проблему, я создал временный метод, который разбивает исходный файл на несколько файлов размером около 50 МБ каждый. Затем я перебираю все файлы меньшего размера и, в свою очередь, разделяю их по заголовкам и т. Д. Теперь мой промежуточный процесс, который разбивает исходный файл, работает только в первый раз. Вот код:

entire_file = FreeFile ' .................................................. get the next FreeFile number
Open orig_path For Input As #entire_file ' ................................ open file for reading
contents = Input$(LOF(entire_file), entire_file) ' ........................ read entire file into a String
Close #entire_file ' ...................................................... close the input file, no longer needed
blocks = Split(contents, "PAGE 10000") ' .................................. split on the PAGE number
contents = "" ' ........................................................... free up memory

Ошибка происходит в строке «blocks = split», однако при наведении курсора мыши на переменную «contents» (Недостаточно памяти), поэтому я не уверен проблема в строке 'blocks = split'.

Я закрываю каждый открытый файл. Я очищаю все строковые переменные. Я устанавливаю все объекты Class в Nothing. Тем не менее, эта проблема с памятью все еще сохраняется. Я просто не могу понять способ очистки памяти, чтобы метод можно было запускать более одного раза. Я пропустил какие-либо другие подходящие данные, которые могли бы помочь диагностировать это?

Я нашел несколько других сообщений, где кто-то сталкивался с той же проблемой, но не было никакого решения проблемы, или, по крайней мере, тема была закрыта до публикации решения. Большое спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...