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/')
  • Вопрос задан
  • 3534 просмотра
Пригласить эксперта
Ответы на вопрос 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.
Подробности легко нагуглите.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы