2017-12-17 1 views
1

Sogou 텍스트 분류 데이터 세트의 토큰을 나타내는 목록이 상당히 많습니다. 남은 12 기가의 램을 가지고 450 000의 전체 훈련 세트를 처리 할 수 ​​있지만 목록 목록에서 numpy.save()를 호출하면 메모리 사용량이 두 배로 늘어나고 메모리가 부족한 것 같습니다.numpy로 목록을 저장할 때 메모리가 부족합니다.

왜 이런가요? numpy.save는 저장하기 전에 목록을 변환하지만 더 많은 메모리를 사용하여 목록을 보유합니까?

이 목록의 목록을 저장하는 다른 방법이 있습니까? 내가 할 수 피클 인수에서 판단 피클 프로토콜을 사용하여 저장 NumPy와 생각 : https://docs.scipy.org/doc/numpy/reference/generated/numpy.save.html

print "Collecting Raw Documents, tokenize, and remove stop words" 
df = pd.read_pickle(path + dataSetName + "Train") 
frequency = defaultdict(int) 

gen_docs = [] 
totalArts = len(df) 
for artNum in range(totalArts): 
    if artNum % 2500 == 0: 
     print "Gen Docs Creation on " + str(artNum) + " of " + str(totalArts) 
    bodyText = df.loc[artNum,"fullContent"] 
    bodyText = re.sub('<[^<]+?>', '', str(bodyText)) 
    bodyText = re.sub(pun, " ", str(bodyText)) 
    tmpDoc = [] 
    for w in word_tokenize(bodyText): 
     w = w.lower().decode("utf-8", errors="ignore") 
     #if w not in STOPWORDS and len(w) > 1: 
     if len(w) > 1: 
      #w = wordnet_lemmatizer.lemmatize(w) 
      w = re.sub(num, "number", w) 
      tmpDoc.append(w) 
      frequency[w] += 1 
    gen_docs.append(tmpDoc) 
print len(gen_docs) 

del df 
print "Saving unfiltered gen" 
dataSetName = path + dataSetName 
np.save("%s_lemmaWords_noStop_subbedNums.npy" % dataSetName, gen_docs) 
+0

이러한 "토큰"은 무엇입니까? 숫자 데이터? 아니면 더 복잡한 객체입니까? – bnaecker

+0

문자열은 각각 하나의 단어입니다. – Kevinj22

+1

왜 numpy를 사용하여 목록의 목록을 저장하고 있습니까? 그것이 의미가 없기 때문에 배열을 먼저 만들려고하면 놀라지 않을 것입니다. –

답변

0

np.save 첫 번째 시도가 배열로 입력을 변환 할 수 있습니다. 결국 이것은 배열이없는 배열을 저장하도록 설계되었습니다.

결과 배열이 숫자 또는 문자열 값 (dtype)을 사용하는 다차원 인 경우 일부 기본 차원 정보와 배열 데이터 버퍼의 메모리 복사본이 저장됩니다.

그러나 배열에 다른 객체 (예 : dtype 객체)가 포함되어 있으면 해당 객체가 피클 링되고 결과 문자열이 저장됩니다.

나는 메모리 오류가 발생

arr = np.array(gen_docs) 

합니까를 시도 할 것인가?

그렇지 않은 경우 shapedtype은 무엇인가요?

tmpDoc (하위 목록)의 길이가 다른 경우 arr은 개체 dtype이있는 1 차원 배열 (tmpDoc 목록)입니다.

tmpDoc이 모두 동일한 길이 인 경우에만 2 차원 배열을 생성합니다. 그럼에도 불구하고 dtype은 숫자, 문자열 또는 다른 객체에 관계없이 요소에 의존합니다.

save 프로토콜을 사용하여 배열을 절편에 추가 할 수 있습니다.

+0

나는 이미 시도했다 : gen_docs = np.array (gen_docs)) 그리고 나서 같은 문제를 저장합니다 .tmpDoc 하위 목록의 길이는 다양합니다. 코드를 다시 실행 한 후 모양과 dtype을 업데이트합니다. – Kevinj22

+0

전체 목록을 배열로 변환 할 수 없으면 여전히 'np.rray (gen_docs [: 100])'형식과 dtype에 관한 동일한 질문이 적용됩니다. – hpaulj

+0

모양을 확인하고 dtype을 확인하기 위해 2500 개의 문서로 실행하십시오. 내가 가지고있는 것은이다 : (2500,) object – Kevinj22

관련 문제