list.append вызывает неэффективность памяти - PullRequest
1 голос
/ 29 июня 2019

Ниже моя функция

def loadData(self,datasetName,target_indx=None):

    tokens =[]
    labels = []
    ids = []
    allLabels = set()
    with open(self.dirPathName+datasetName+".csv",mode="r",encoding="UTF-8") as f:
        for line in f:
            id,t, l = self.processLine(line)
            tokens.append(t)
            labels.append(l)
            ids.append(id)
            allLabels = allLabels.union(set(l))
    labelsList = list(allLabels)
    labelsList.sort()
   # print ("getting targets")
    targets = self.getTargets(labelsList,labels)
    #print ("finished getting targets")
    docs = []
    #print "read: " + str(len(targets))
    for i in range(len(tokens)):
        doc = self.make_document(ids[i],tokens[i],labels[i],targets[i],target_indx=target_indx)
        docs.append(doc)
    return docs

выделенный фрагмент кода

Файл CSV, который открывается для обработки вышеуказанным кодом, имеет размер 700 МБ. Содержит около 130000 строк.

Моя проблема заключается в выделенном фрагменте кода, как показано на рисунке выше. Максимальное значение len (токены) равно 75000. Таким образом, цикл for будет выполняться столько раз. Теперь функция self.make document обработает определенный код, а затем результат будет добавлен в список под названием docs , как показано в выделенной части изображения. Это заставляет мою память зависнуть.

Вот код make_document

def make_document(self,docid, tokens, labels, target,target_indx=None):
        """Return Document object initialized with given token texts."""
        #Here tokens is tokenized version of each line of text. So for first line it is ['Angiosperm','is','a']
        #Here labels is labels assigned to that document i.e.['7','71']
        #target is of shape length of unique labels. In our case 37. It is a numpy array with all zeros except where '7' is located 
        #in the unique labelsdictionary and '71' is located in the unique labels dictionary


        #This gives data in the following format:- [Token('Angiosperm'),Token('is'),Token('a')]
        tokens = [Token(t) for t in tokens]
        # We don't have sentence splitting, but the data structure expects
        # Documents to contain Sentences which in turn contain Tokens.
        # Create a dummy sentence containing all document tokens to work
        # around this constraint.

        #Create a sentence object
        sentences = [Sentence(tokens=tokens)]
        #Create a document object
        doc =  Document(id=docid,target_idx=target_indx,target_str=str(labels), sentences=sentences)
        doc.set_target(target)
        return doc

Этот код, как вы видите, вызывает класс Document, который затем возвращает объект. Снимок объекта ниже:

Объект документа

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

...