Ниже моя функция
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, который затем возвращает объект. Снимок объекта ниже:
Объект документа
Я знаю, что большая память не имеет значения, если вы пишете неэффективный код, и это то, что произошло. Может кто-нибудь предложить мне что-нибудь?