#python #memory #segmentation-fault #allocation
#python #память #ошибка сегментации #выделение
Вопрос:
Я считываю строки из базы данных sqlite, перебираю их, а затем использую переменные из каждой строки в качестве аргументов для функции, которая генерирует графики, что-то вроде следующего псевдокода
conn=sqlite3.connect(db)
c=conn.cursor()
myrows=c.execute("select * from values WHERE var=1")
for burst in myrows:
met=burst[1]
make_plot(met)
c.close()
Через определенное время это выдает одну из следующих ошибок:
1) запрошено 86392 элемента, но ошибка сегментации чтения только 0
2) невозможно выделить 3072000 байт Прервано
3) Ошибка сегментации
make_plot() должен считывать большой файл (~ 8 МБ) и выполнять некоторые операции с данными, а в myrows ~ 500 элементов. Из ошибок я думаю, что у меня заканчивается память (?), Но мне не удалось найти ничего, что помогло бы мне отследить / диагностировать эту проблему. Есть идеи о том, как я мог бы это сделать?
Ответ №1:
не могли бы вы сказать что-то вроде приведенного ниже, если все, что вас волнует, это второе поле?
myrows=c.execute("select values.bust from values WHERE var=1")
кроме того, мне интересно, вы действительно хотите создать график для каждой строки … разве вы не хотите отображать все данные на одном графике?
Комментарии:
1. Привет, каждая запись в базе данных, которую я выбираю, имеет свои собственные данные и свой собственный график, который необходимо создать. Опубликованный мной код представляет собой упрощенную версию, которая содержит только шаги (т. Е. Я удалил большинство переменных). Приветствия
2. итак, этот make_plot () открывает файл размером ~ 8 МБ для каждого вызова и процесса, который объединяется с записью в
myrows
? Знаете ли вы, что ошибка возникает из my_plot() или из этого цикла между записями в вашей базе данных? Есть ли вероятность, что там какая-то утечка памяти или незаконный доступ к памяти?3. Оказалось, что версия модуля pyfits, которую я использовал (2.4), имела утечку памяти, я обновился до 3.0, и это улучшило проблему, т. Е. Она работала дольше, прежде чем использовать всю мою оперативную память. Оказывается, мне также не хватало plt.close (рис.) в конце моей функции построения графика — выскочил, и все это сработало нормально. Приветствия
4. @user1027686: всегда приятно слышать, что все начинает работать!
Ответ №2:
Попробуйте и посмотрите, изменив ваше for
утверждение на:
for burst in c.execute("select * from values WHERE var=1"):
# your code here
строки извлекаются не по одной, а в одном пакете.