Я написал скрипт на Python (используя Python 3.7), который находит пары слов в файле XML (TEI), где хотя бы одно слово содержит символ 'long-s'.Затем он заменяет символ «long-s» на современные строчные буквы s и записывает реплицированный файл, но с обновленными «современными» написаниями.Я не могу использовать простую операцию поиска и замены, так как сценарий разрабатывается для контекстной замены (поскольку OCR часто неправильно распознает «long-s» как f - например, «несколько» против «шить»).Сценарий использует регулярные выражения для поиска пар, а затем создает эквивалентные пары с «современным» написанием, которые он записывает в текстовый файл.Затем он создает словари python из этих файлов для выполнения операции замены (надеюсь, это имеет смысл).Файл, в который записываются пары слов, представляет собой простой текстовый файл, который другие могут редактировать вручную, чтобы повысить точность будущих операций замены.
Сценарий работал отлично, однако недавно я изменил режим чтения / записи (сw
до a+
), чтобы другие могли редактировать текстовый файл, и с тех пор скрипт генерирует ошибку памяти при каждом запуске.Иногда он будет записывать несколько новых файлов до появления ошибки, в других случаях он вообще не будет записывать никаких файлов.Код довольно грубый, и я знаю, что есть много возможностей для улучшения, однако я озадачен тем, почему изменение режимов чтения / записи может внезапно вызвать ошибку памяти, когда это никогда не происходило раньше.
Этоэто сообщение об ошибке:
Traceback (most recent call last):
File "Z:\...\LongS_Correction_Tool\CLEaN-CL-2.0.py", line 575, in <module>
main()
File "Z:\...\LongS_Correction_Tool\CLEaN-CL-2.0.py", line 435, in main
file_before_words = open(cwd + "\\before_words_main.txt","r", encoding="utf-8-sig").read()
File "C:\Python37-32\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
File "C:\Python37-32\lib\encodings\utf_8_sig.py", line 67, in _buffer_decode
codecs.utf_8_decode(input[3:], errors, final)
MemoryError
Общий размер всех файлов, с которыми работает скрипт, составляет около 200 МБ, и я попытался запустить код на разных компьютерах, и при этом выполнялось как можно меньше процессов.Пока что это не имеет никакого значения, и одна и та же ошибка генерируется независимо от других работающих программ и от конкретного используемого компьютера.Я прочитал несколько постов об использовании pandas
и numpy
для python для кода, который требует много памяти или «больших данных», и я также читал о разбивке на части, однако я все еще озадачен, почему что-то из этого может бытьнеобходимо, учитывая относительно небольшой размер файлов.Я также запустил сценарий с открытым диспетчером задач, и он показывает около 35% использования памяти в целом, достигнув пика в 38%.Использование сети составляет около 55% и достигает пика в 57%.Компьютерам, использовавшимся для запуска сценария, около 6 месяцев, и все они являются 64-разрядными системами с 16 ГБ ОЗУ (и процессоры i7 должны быть важны).
Похоже, ошибка указывает на кодировку utf-8/ decoding вызывает проблему, и я понимаю (после прочтения некоторых других сообщений), что модуль кодеков может быть использован для обработки таких ошибок, но я все еще не уверен, почему это будет необходимо, если скрипт работал с предыдущими операциями чтения / записирежимы.Я понимаю, что оригинальный режим w
перезаписывает файлы, тогда как новый a+
открывается для добавления файлов, поэтому это может означать, что файлы, конечно, больше, так как в них больше строк, но файлы все равно не кажутся такими большимив общем и целом.Код длиной 575 строк, поэтому я не стал его публиковать, чтобы сделать это сообщение максимально коротким (я знаю, что оно длинное, извините!).Тем не менее, я полностью понимаю, что отправка кода - это правильная вещь, поэтому, если это поможет, тогда я, конечно, опубликую ее.
Извините, если я упускаю что-то очевидное, однако кто-нибудь можетпомогите пожалуйста с чем может быть причиной ошибки?Если это попытка обработать файлы с помощью модуля кодеков, то я попробую, но мне было просто интересно, не вижу ли я лучшего направления для решения проблемы.
Большое спасибо за любую помощь, я действительно ценю это.