Python: ошибка выделения памяти

#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
  

строки извлекаются не по одной, а в одном пакете.