Задать вопрос
hawkkoff
@hawkkoff

Почему умирает процесс Python с Killed: 9?

Добрый день!
Есть два больших numpy array (сотни тысяч сток, сотни тысяч столбцов), нужно посчитать сумму значений в каждом столбце у каждого списка, посчитать формулу, записать результаты.

Пробовал подход в лоб (сразу всё высчитывать) получил Killed: 9 и подумал, что проблема в памяти. Переписал чтобы поочереди высчитал сумму у каждого списка (чтобы потом их удалять и освобождать память) так он даже так выдаёт Killed: 9.

Вопросы:
1. Заметил что при подходе с записью в файлы память всё равно расходуется сильно (~2гб и расход увеличивается). Кто нибудь может объяснить на что?
2. Что за ошибка Killed: 9? Как её исправить?? Нашёл большое количество постов про неё, но только в отношении обновления на Yosemite.

def sum_and_write(token,count,path,tonal):
    progress = progressbar.ProgressBar()
    f = open(path+tonal+'.csv', 'a')
    for i in progress(xrange(count)):
        val=sum(token[:,i])
        f.write(str(val)+'\n')
        
    f.close()


def deltatfidf(data_text_score, path):
    ##Создаём корпусы негатива и позитива
    print "Создание корпусов"
    corpus_neg=[i.decode('utf-8') for i in data_text_score['text'][data_text_score['score']==0]]
    corpus_pos=[i.decode('utf-8') for i in data_text_score['text'][data_text_score['score']==1]]
    corpus_all=corpus_neg+corpus_pos
    #Считаем веса
    weight_pos=1
    weight_neg=float(len(corpus_pos))/len(corpus_neg)
    #Задаём параметры токенизации
    vectorizer = CountVectorizer(ngram_range=(1,1), min_df=4)
    #Фитим токенизатор на всём корпусе
    print "Фитим модель"
    model=vectorizer.fit(corpus_all)
    #Записываем словарь в файл vocabulary.txt
    vocabulary=model.vocabulary_.keys()
    vocabulary.sort()
    print "Пишем словарь"
    f = open(path+'vocabulary.csv', 'a')
    for i in progress(vocabulary):
        f.write(str(i)+'\n')
        
    f.close()
    count=len(vocabulary)
    print 'Кол-во ngramm - '+str(count)
    #Размечаем позитив и записываем суммы DF терминов pos.txt
    print "Токенизируем позитив"
    token=model.transform(corpus_pos).toarray()
    print "Суммируем и пишем в файл"
    sum_and_write(token,count,path,"pos")
    del token
    #Размечаем негатив и записываем суммы DF терминов pos.txt
    print "Токенизируем негатив"
    token=model.transform(corpus_pos).toarray()
    print "Суммируем и пишем в файл"
    sum_and_write(token,count,path,"neg")
    del token
    #Загружаем все файлы
    print "Загружаем результаты"
    voc=pd.DataFrame(path+'vocabulary.csv', sep=';', columns=['data'])
    pos=pd.DataFrame(path+'роs.csv', sep=';', columns=['data'])
    neg=pd.DataFrame(path+'neg.csv', sep=';', columns=['data'])
    print "Объединяем"
    DATA=pd.DataFrame([voc['data'],pos['data'],neg['data']], column=['ngramm', 'pos', 'neg'])
    #Счиатем дельту
    print "Считаем дельту"
    DATA['delta']=np.log2((float(1+DATA['pos'])*weight_pos)/(float(1+DATA['neg'])*weight_neg))
    #Пишем результат
    print "Выгружаем"
    DATA.to_csv(path+'result.csv', sep=';')



from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import numpy as np
import progressbar
progress = progressbar.ProgressBar()

data=pd.read_csv('/Python/reviews/clean_data/oper_data_BIG_ALL_binary.csv', sep=';')
data_txt=data[['contra','pro', 'text','score']]
text=data_txt[pd.isnull(data_txt['text'])==False]

del data, data_txt

deltatfidf(text,'/Python/reviews/clean_data/temp/')
  • Вопрос задан
  • 3588 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@lega
Вам нужно оптимизировать алгоритм, использовать меньше памяти, перевести все что возможно на итераторы.
Например этот код в теории создает 3 гигантских массива:
corpus_neg=[i.decode('utf-8') for i in data_text_score['text'][data_text_score['score']==0]]
    corpus_pos=[i.decode('utf-8') for i in data_text_score['text'][data_text_score['score']==1]]
    corpus_all=corpus_neg+corpus_pos

Можно изменить например так, corpus_all вернет те же данные без использования списков.
def corpus_all():
    for i in data_text_score['text'][data_text_score['score']==0]:
        yield i.decode('utf-8')
    for i in data_text_score['text'][data_text_score['score']==1]:
        yield i.decode('utf-8')
Ответ написан
@pansa
> 2. Что за ошибка Killed: 9?
Запускаете в Linux? Скорее всего это работа OOM Killer, ваш распухший процесс он убивает сигналом SIGKILL.
Подробности легко нагуглите.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы