2016-04-26 12 views
0

python 2.7でcPickleを使用してリストに追加するように書き込みしようとしていますが、追加しません。python 2.7 cPickle appendリスト

コード:

import cPickle 
import numpy 
a = numpy.array([[1, 2],[3, 4]]); 
output = open("1.pkl",'wb'); 
cPickle.dump(a,output); 
a = numpy.array([[4, 5],[6, 7]]); 
output = open("1.pkl",'ab'); 
cPickle.dump(a,output); 
print(cPickle.load(open("1.pkl",'rb'))); 

出力:

[[1 2] 
[3 4]] 

私は

コードの前にテキストファイルで配列を付加するために、このメソッドを使用していました10

a = numpy.array([[1, 2],[3, 4]]); text_file = open("1.txt", "w"); numpy.savetxt(text_file, a); text_file.close(); a = numpy.array([[4, 5],[6, 7]]); text_file = open("1.txt", "a"); numpy.savetxt(text_file, a); text_file.close(); text_file = open("1.txt", "r"); print(text_file.read()); 

出力:

1.000000000000000000e+00 2.000000000000000000e+00 
3.000000000000000000e+00 4.000000000000000000e+00 
4.000000000000000000e+00 5.000000000000000000e+00 
6.000000000000000000e+00 7.000000000000000000e+00 

私はPower SystemsのためのPythonシミュレーションI・セットアップのデータを書き込むために、これを使用していました。出力データは約7GBです。そして、書き込みプロセスは、シミュレーションを大幅に遅くしていました。私は、cPickleが書き込み処理を高速化できることを読んだ。

データ全体を読み取らずにcPickle出力ファイルに追加するにはどうすればよいですか?

また、書き込みを高速化するためにcPickleに代わるより良い方法がありますか?

答えて

0

私はあなたがちょうどピクルに、またはとにかく意味がある方法で追加することはできないと信じています。

オブジェクトの現在のシリアル化バージョンを取得し、ファイルの最後に別のシリアル化オブジェクトを追加すると、2番目のオブジェクトが元のリストに魔法のように追加されるだけではありません。

元のオブジェクトを読み込み、Pythonでそれを追加してから、元に戻す必要があります。

import cPickle as pickle 
import numpy as np 

filename = '1.pkl' 

a = np.array([[1, 2],[3, 4]]) 
b = np.array([[4, 5],[6, 7]]) 

# dump `a` 
with open(filename,'wb') as output_file: 
    pickle.dump(a, output, -1) 

# load `a` and append `b` to it 
with open(filename, 'rb') as output_file: 
    old_data = pickle.load(output_file) 
    new_data = np.vstack([old_data,a]) 

# dump `new_data` 
with open(filename, 'wb') as output_file: 
    pickle.dump(new_data, output_file, -1) 

# test 
with open(filename, 'rb') as output_file: 
    print(pickle.load(output_file)) 

質問をもう一度読み終えたら、データ全体をもう一度読み込みたくないと述べています。私はこれがあなたの質問に答えないと思います、それはありますか?