2014-11-28 2 views
0

pickle을 사용하여 다른 데이터 세트를 통해 생성하는 몇 개의 큰 데이터 세트를 저장하려고합니다. 덤핑하는 동안 오류는 발생하지 않지만 이러한 데이터 세트를로드하려고하면 피클이 eof 오류로 종료됩니다. 다음은 데이터 집합을 저장하기 위해 실행하는 코드입니다.Pickle이 데이터 프레임을 저장할 수 없음

from scipy.stats.mstats import mode 
trainingSetCustomers = pd.DataFrame({'visitFrequency': trainingSet.size(),'totalAmountSpent': trainingSet['amountSpent'].sum(),'totalProducts': trainingSet['productCount'].sum(),'firstVisit': trainingSet['visitDate'].min(),'lastVisit': trainingSet['visitDate'].max(),'visitType':trainingSet['visitType'].apply(f),'country': trainingSet['country'].apply(f),'isReferred':trainingSet['isReferred'].sum()}).reset_index() 
p2 = pickle.Pickler(open("trainingSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew 
p2.clear_memo() 
p2.dump(trainingSetCustomers) 
print "Training Set saved" #Done 
trainingResultSetCustomers = pd.DataFrame({'futureVisitFrequency': trainingResultSet.size(),'futureTotalAmountSpent': trainingResultSet['amountSpent'].sum(),'futureTotalProducts': trainingResultSet['productCount'].sum(),'firstVisit': trainingResultSet['visitDate'].min(),'lastVisit': trainingResultSet['visitDate'].max(),'visitType':trainingResultSet['visitType'].apply(f),'country': trainingResultSet['country'].apply(f),'isReferred':trainingResultSet['isReferred'].sum()}).reset_index() 
p3 = pickle.Pickler(open("trainingResultSetCustomers.p","wb")) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew 
p3.clear_memo() 
p3.dump(trainingResultSetCustomers) 
print "trainingresult set saved" #Done 

이것은 오류없이 실행되고 메시지를 인쇄합니다. 하지만 다음 코드를 실행하면

trainingResultSetCustomers = pickle.load(open("trainingResultSetCustomers.p", "rb")) 

그것은 나에게는 EOFError을 제공합니다. 이러한 종류의 테스트 세트 4 개를 저장해야하며 실제로 이런 일이 발생하는 이유는 혼란 스럽습니다. 내가 차이를 만드는 경우 SSH를 통해 IPython 노트북에서 그것을 실행하고 있습니다. 또한 5 행만 사용해도 완벽하게 작동합니다.

데이터 구조 : 코드에서 알 수 있듯이이 데이터 프레임은 그룹화 된 개체의 속성에 의해 생성됩니다.

몇 가지 테스트 코드와 버전 번호의 부재에서
EOFError         Traceback (most recent call last) 
<ipython-input-10-86d38895c564> in <module>() 
     5 p = pickle.Pickler(o) #finaldatasetYear1AndYear2 #trainingset groupedCustomersWithDates dfOrdersNew groupedCustomersNew 
     6 p.clear_memo() 
----> 7 trainingset = pickle.load(o) 
     8 o.close() 
     9 print "done" 

/usr/lib/python2.7/pickle.pyc in load(file) 
    1376 
    1377 def load(file): 
-> 1378  return Unpickler(file).load() 
    1379 
    1380 def loads(str): 

/usr/lib/python2.7/pickle.pyc in load(self) 
    856    while 1: 
    857     key = read(1) 
--> 858     dispatch[key](self) 
    859   except _Stop, stopinst: 
    860    return stopinst.value 

/usr/lib/python2.7/pickle.pyc in load_eof(self) 
    878 
    879  def load_eof(self): 
--> 880   raise EOFError 
    881  dispatch[''] = load_eof 
    882 
+0

실행할 수있는 최소한의 예를 들려 줄 수 있습니까? 일반'pickle' 또는'jsonpickle'을 사용하고 있습니까? – user4815162342

+0

일반 피클, 나는 데이터가 너무 거대하기 때문에 최소한의 예제를 제공하지 않습니다. 그러나 나는 당신에게 데이터의 구조를 말할 수 있습니다. – Sudh

+0

문제는이 거대한 데이터 세트 또는 작은 데이터 세트에서만 나타납니다. – user4815162342

답변

0

, 내가 볼 수있는 유일한 것은 당신이 pandas.Dataframe 객체를 사용하고 있습니다 :

내가 얻을 오류입니다. 이 녀석들은 종종 pandas 내장 된 산세 방법에 내장 된 특별한 취급을 필요로 할 수 있습니다. 나는 pandasto_picklesave 방법을 제공한다고 믿는다.이 방법은 Dataframe에 대한 산세를 제공한다. 참조 : How to store data frame using PANDAS, Python 및 내의 링크.

그리고 피클을 시도하는 크기와 의존성 버전에 따라 64 비트 산세 버그에 부딪 힐 수 있습니다. 참조 : Pickling a DataFrame.

ssh 시리얼 데이터를 전송하는 경우 패킷 제한이 적용되지 않는지 확인하고 싶을 수 있습니다. ssh을 통해 코드를 실행하는 경우 잠재적 인 문제가 아니어야합니다.

+0

흥미롭게도 파일을 pickling 한 후에 별도의 file.flush()를 추가하면 오류가 사라졌습니다. 그래, 문제는 to_pickle에서도 해결되었을 수도 있다고 생각합니다. ssh가 문제가되지 않도록 서버에서 코드를 실행하고있었습니다. 올바른 방향으로 저를 움직이는 것처럼 당신의 대답을 받아들입니다. – Sudh

관련 문제