Уведомления

Группа в Telegram: @pythonsu

#1 Май 15, 2017 22:43:44

DianaLeto
Зарегистрирован: 2017-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

Всем привет!
Подгружается файл с базой данных размером 400 мб
При компиляции выдается ошибка MemoryError

 begin
end extract
Traceback (most recent call last):
  File "C:\!Work\Lab8\lab8 — копия.py", line 185, in <module>
    X=evaluate_X(D)
  File "C:\!Work\Lab8\lab8 — копия.py", line 92, in evaluate_X
    X.append(ex[1:])
MemoryError
>>>
Где-то прочитала, что нужно не весь файл перебирать, а по строчкам, чтобы хватало памяти.
Кто-нибудь может помочь мне сделать это?
Программа по SVM, Метод Опорных Векторов
Прилагаю код

 #!/usr/bin/python
import csv
import os
import math
import sys
import random
import numpy as np
from svmutil import*
import collections
def extract_data_from_file(data_path):
        fin = open(data_path, "rb")
        #row = fin.readline()
        data_extract = []
        for l in fin:
                line = l.split()
                float_line = []
                j=1
                float_line.append(float(line[0]))
                data_extract.append(float_line)
                for e in line[1:]:
                        line1=e.decode().split(":")
                        while(e[0]>j):
                                float_line.append(float(0))
                                j=j+1
                                float_line.append(float(e[1]))
                                data_extract.append(float_line)
                
                #row = fin.readline()
        return data_extract
def transform_datas(data):
        datas_transformed = []
        for point in data:
                data = []
                data.append(1)
                data.append(point[0])
                data.append(point[1])
                data.append(point[0]**2)
                data.append(point[1]**2)
                data.append(point[0]*point[1])
                data.append(abs(point[0]-point[1]))
                data.append(abs(point[0]+point[1]))     
                datas_transformed.append((data,point[2]))
        return datas_transformed
def linear_regression_training(N):
        X,y = zip(*N)
        X_d = np.linalg.pinv(X)
        w = np.dot(X_d,y)
        return w
def linear_regression_training_weight_decay(N, k):
        X,y = zip(*N)
        reg = np.identity(len(X[0]))*(10**k)
        X = np.matrix(X)
        y = np.matrix(y)
        X_t = np.transpose(X)
        w = (np.linalg.inv( (X_t*X + reg) ) * X_t )*np.transpose(y)
        return w
def evaluate_g(ex,w):
        r = sum(ex_i*w_i for ex_i,w_i in zip(ex,w))
        if r > 0:
                return float(1)
        elif r < 0:
                return float(-1)
def evaluate_f(X,digit):
        y=[]
        for ex in X:
                if ex[0]==digit:
                        y.append(1)
                      
                else:
                        y.append(-1)
        return y
def evaluate_f_cut(X,digit1,digit2):
        y=[]
        for ex in X:
                if ex[0]==digit1:
                        y.append(1)
                      
                elif ex[0]==digit2:
                        y.append(-1)
        return y
def evaluate_X(data):
        X=[]
        for ex in data:
                X.append(ex[1:])
        
        return X
def Cut_data(data,digit1,digit2):
        X=[]
        for ex in data:
                if((ex[0]==digit1) or (ex[0]==digit2)):X.append(ex)
        
        return X
def calculate_E(points, w):
        X,y = zip(*points)
        nWrong = 0
        for i in xrange(len(points)):
                if y[i] != evaluate_g(X[i],w):
                        nWrong += 1
        pWrong = float(nWrong) / len(points)
        return pWrong
def BinaryError(f,g):
        err=0
        for i in range(len(f)):
                if (f[i]!=g[i]): err=err+1
        return err/len(f)
def calculate_weight_decay(weights, N, k):
        l = 10**k
        return ((l/N)*sum(w*w for w in weights))
def Rand_part(D,nomer):
              N=[]
              for j in range(len(D)):
                      if(j<(nomer-1)*len(D)/10 or j>=nomer*len(D)/10+1):
                            N.append(D[j])  
             
              return N
print('begin')
in_data_path='webspam_wc_normalized_unigram.txt'
out_data_path='test.txt'
datas_train = extract_data_from_file(in_data_path)
##datas_train_transformed = transform_datas(datas_train)
##datas_test = extract_data_from_file(out_data_path)
##datas_test_transformed = transform_datas(datas_test)
print('end extract')
#ex2-4
##X=evaluate_X(datas_train)
##j=0
##while (j<10):
##        digit=j
##        y=evaluate_f(datas_train,digit)
##        prob = svm_problem(y,X)
##        options='-s 0 -t 2 -d 2 -c 0.01 -g 1 -r 1'
##        param = svm_parameter(options)
##    
##        m=svm_train(prob,param)
##        p_labels, p_acc, p_vals = svm_predict(y,X, m)
##        E_in=BinaryError(y,p_labels)
##        print(j,E_in, len(m.get_SV()) )
##        
##        j=j+2
#ex2-4
#ex5-6
##digit1=1
##digit2=5
##D=Cut_data(datas_train,digit1,digit2)
##X=evaluate_X(D)
##y=evaluate_f(D,digit1)
##print(len(X),len(y))   
##datas_test = extract_data_from_file(out_data_path)
##D=Cut_data(datas_test,digit1,digit2)
##X_test=evaluate_X(D)
##y_test=evaluate_f(D,digit1)
##print(len(X_test),len(y_test))       
##C=0.0001
##print('-s 0 -t 1 -d 5 -c '+str(C)+' -g 1 -r 1')
##while (C<1.1):
##        
##        prob = svm_problem(y,X)
##        options1='-s 0 -t 1 -d 5 -c '+str(C)+' -g 1 -r 1'
##        param1 = svm_parameter(options1)
##        m1=svm_train(prob,param1)
##        p_labels, p_acc, p_vals = svm_predict(y,X, m1)
##        E_in=BinaryError(y,p_labels)
##        p_labels_t, p_acc_t, p_vals_t = svm_predict(y_test,X_test, m1)
##        E_out=BinaryError(y_test,p_labels_t)
##        print('c=',C,'E_in',E_in,'E_out=',E_out,'SV=', len(m1.get_SV()) )
##        C=C*10
        
#ex5-6
#ex7-8
digit1=1
digit2=5
D=Cut_data(datas_train,digit1,digit2)
X=evaluate_X(D)
y=evaluate_f(D,digit1)
##datas_test = extract_data_from_file(out_data_path)
##D=Cut_data(datas_test,digit1,digit2)
##X_test=evaluate_X(D)
##y_test=evaluate_f(D,digit1)
##print(len(X_test),len(y_test))
C=0.0001
Q=[]
D1=[]
print(len(D))
E_cv=0
C_list=[]
nom=[]
i=0
for i in range(100):
        j=0
        while (j<=round(len(D)/10)):
                s=random.randint(1,len(D))
                if ((s in nom)!=True):
                        nom.append(s)
                        j=j+1
        j=0
        while (j<len(D)):
              if(j in nom):
                    Q.append(D[j])
              else: D1.append(D[j])  
              j=j+1  
       
        #print(len(D1),len(Q))
        X=evaluate_X(D1)
        y=evaluate_f(D1,digit1)
        X_val=evaluate_X(Q)
        y_val=evaluate_f(Q,digit1)
        
        #print('-s 0 -t 1 -d 2 -c '+str(C)+' -g 1 -r 1')
        prob = svm_problem(y,X)
        C=0.001
        minimum=1
        while (C<0.002):
                options1='-s 0 -t 1 -d 2 -c '+str(C)+' -g 1 -r 1'
                param1 = svm_parameter(options1)
                m1=svm_train(prob,param1)
                p_labels_t, p_acc_t, p_vals_t = svm_predict(y_val,X_val, m1)
                E_cv=E_cv+BinaryError(y_val,p_labels_t)
                #print('c=',C,'E_cv=',E_cv,'SV=', len(m1.get_SV()))
##                if(E_cv<minimum):
##                        C_min=C
##                        minimum=E_cv
                C=C*10
        #C_list.append(C_min)
        Q.clear()
        D1.clear()
        nom.clear()
print('E_cv=',E_cv/100)
#cc=collections.Counter(C_list)
#print('0.0001=',cc[0.0001],'0.001=',cc[0.001],'0.01=',cc[0.01],'0.1=',cc[0.1],'1=',cc[1.0],)
               
#ex7-8
###ex9-10
##digit1=1
##digit2=5
##D=Cut_data(datas_train,digit1,digit2)
##X=evaluate_X(D)
##y=evaluate_f(D,digit1)
##print(len(X),len(y))   
##datas_test = extract_data_from_file(out_data_path)
##D=Cut_data(datas_test,digit1,digit2)
##X_test=evaluate_X(D)
##y_test=evaluate_f(D,digit1)
##print(len(X_test),len(y_test))       
##C=0.01
##print('-s 0 -t 2 -c '+str(C)+' -g 1')
##while (C<1000001):
##        
##        prob = svm_problem(y,X)
##        options1='-s 0 -t 2  -c '+str(C)+' -g 1'
##        param1 = svm_parameter(options1)
##        m1=svm_train(prob,param1)
##        p_labels, p_acc, p_vals = svm_predict(y,X, m1)
##        E_in=BinaryError(y,p_labels)
##        p_labels_t, p_acc_t, p_vals_t = svm_predict(y_test,X_test, m1)
##        E_out=BinaryError(y_test,p_labels_t)
##        print('c=',C,'E_in',E_in,'E_out=',E_out,'SV=', len(m1.get_SV()) )
##        C=C*100
##        
#ex9-10
##datas_test = extract_data_from_file(out_data_path)
##X_test=evaluate_X(datas_test)
##y_test=evaluate_f(datas_test,digit)
##p_labels, p_acc, p_vals = svm_predict(y_test,X_test, m)

Отредактировано DianaLeto (Май 15, 2017 22:53:40)

Офлайн

#2 Май 15, 2017 23:03:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

DianaLeto
базой данных размером 400 мб
DianaLeto
Где-то прочитала, что нужно не весь файл перебирать, а по строчкам, чтобы хватало памяти.
А строчка
DianaLeto
end extract
Вам ничего не говорит? Дело не только в чтении файла.



Офлайн

#3 Май 15, 2017 23:12:40

DianaLeto
Зарегистрирован: 2017-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

Т.е. я поняла, что данные он извлекает, выводя мне сообщение “end extract”
Но что дальше происходит и почему возникает тогда ошибка MemoryError?

Офлайн

#4 Май 15, 2017 23:29:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

DianaLeto
и почему возникает тогда ошибка MemoryError?
Ответ очевиден. Потому что память не бесконечна.
Вы у себя в коде конструкции наблюдаете:
 a = ....
Практически все они приводят к созданию новых объектов в памяти.



Офлайн

#5 Май 15, 2017 23:32:57

DianaLeto
Зарегистрирован: 2017-05-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

И как мне это победить?

Офлайн

#6 Май 16, 2017 02:20:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

Ошибка MemoryError при компиляции :(

DianaLeto
И как мне это победить?
Нужно по возможности все такие функции превращать в генераторы.
Пример превращения:
  
>>> def f1():
...     out = []
...     for i in 'abcd':
...         out.append(i)
...     return out
... 
>>> def f2():
...     for i in 'abcd':
...         yield i
... 
>>> f1()
['a', 'b', 'c', 'd']
>>> f2()
<generator object f2 at 0xb73bf57c>
>>> list(f2())
['a', 'b', 'c', 'd']
>>>
Где-то это может и не получиться, потому что нужно именно в памяти держать все данные, потому что источник данных может закрыться на середине. Но бывает это в основном с файлами, если они могут закрываться где-то снаружи генератора. То есть генератор берёт из файла, а кто-то снаружи файл закрывает, не зная про генератор.

Но для новичка вместо всего этого подойдёт другой вариант, который работает не хуже исходного, но при этом не тратит оперативную память - это сохранять промежуточные результаты на диск в файл и потом открывать его и читать их заново, передавая их дальше и потом опять сохраняя результаты.

Если же база может быть ещё больше, чем сейчас, то она не сможет загрузиться в память ни разу, поэтому всё равно придётся переделывать код на генераторы. Так что если время есть, надо сделать на генераторах всё, а если времени нет, то надо сделать на промежуточных файлах. И в случае промежуточных файлов если база будет большая потом и не поместится в память даже один раз, то некоторые куски кода можно будет переделать на генераторы, чтобы чисто в файл они могли сохраниться. Получится как бы гибридный говнокод, но рабочий.

Так что учись на генераторах делать всё.
Тут примеры
http://getpython3.com/diveintopython3/generators.html#a-fibonacci-generator
http://getpython3.com/diveintopython3/iterators.html#a-fibonacci-iterator
http://getpython3.com/diveintopython3/advanced-iterators.html#generator-expressions



Отредактировано py.user.next (Май 16, 2017 02:22:58)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version