Python и потребление памяти - PullRequest
0 голосов
/ 02 марта 2010

Я ищу способ справиться с перегрузкой ОЗУ и ЦП с помощью программы с большим объемом памяти ... Я хотел бы обработать БОЛЬШОЙ объем данных, содержащихся в файлах. Затем я читаю файлы и обрабатываю данные в них. Проблема в том, что существует множество вложенных циклов, и из всех обработанных данных создается корневой XML-файл. Программа легко потребляет пару гигабайт оперативной памяти примерно через полчаса работы. Есть ли что-то, что я могу сделать, чтобы не дать ОЗУ стать настолько большим и / или обойти это ..?

1 Ответ

3 голосов
/ 02 марта 2010

Вам действительно нужно хранить все данные из файла XML в памяти сразу?

Большинство (всех?) Библиотек XML позволяют выполнять итеративный анализ , что означаетчто вы храните в памяти только несколько узлов XML-файла , , а не весь файл .Это если вы сами не создаете строку, содержащую XML-файл без какой-либо библиотеки, но это немного безумно.В этом случае используйте библиотеку КАК МОЖНО СКОРЕЕ.

Конкретные примеры кода, представленные здесь , могут не относиться к вашему проекту, но учитывают несколько принципов, подтвержденных тестированием и lxml документация - при работе с данными XML, измеряемыми в гигабайтах или более:

  • Использование стратегии итеративного анализа для пошаговой обработки больших документов.
  • При поискеВесь документ в случайном порядке требуется, перейдите в индексированную базу данных XML.
  • Будьте предельно консервативны в данных, которые вы выбираете.Если вас интересуют только определенные узлы, используйте методы, которые выбираются по этим именам.Если вам требуется синтаксис предиката, попробуйте один из доступных классов и методов XPath.
  • Рассмотрите текущую задачу и уровень комфорта разработчика.Объектные модели, такие как objectify lxml или Amara, могут быть более естественными для разработчиков Python, когда скорость не учитывается. cElementTree быстрее, когда требуется только синтаксический анализ.
  • Найдите время, чтобы выполнить даже простой сравнительный анализ.При обработке миллионов записей складываются небольшие различия, и не всегда очевидно, какие методы являются наиболее эффективными.

Если вам необходимо выполнять сложные операции с данными, зачемВы просто помещаете это в реляционную базу данных и оперируете данными оттуда?Это будет иметь лучшую производительность.

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