2016-08-07 13 views
0

Pythonのpickleモジュールを使用して大きなデータを保存しています。次のように私は同じピクルス・ファイルへの2つのオブジェクトをダンプしています、より正確には:pickleはUbuntu 14.04でEOFErrorを発生させますが、Mac OSとLinux Mintで動作します

def save(sim): 
    if sim.tstamp > 0: 
     with open(filepath(sim.identifier), 'wb') as f: 
      pickle.dump(sim.serialize(), f) 
      pickle.dump(sim, f) 
    else: 
     raise ValueError("Simulation not yet simulated") 

simは異なる属性とserialize()というメソッドを持っている自己記述されたクラスです。この方法は、のようなものを使用して辞書にすべての属性とその値を変換します。

def serialize(self): 
    keys = ['height', 'diameter', 'rpm', 'packaging'] 
    serialized = dict((key, getattr(self, key)) for key in keys) 
    serialized['sectors'] = [sector.serialize() for sector in self.sectors] 
    return serialized 

そこで、基本的sim.serialize()第一の目的として、ピクルスファイルにダンプされた辞書を返します。 2番目のオブジェクトは、simオブジェクトそのものです。これは、各simオブジェクトのサイズが大きいためです。ディクショナリを提供することで、実際には必要ない場合に完全なシミュレーションをロードすることを防ぐための一種の要約が可能になります。

私が使用ピクルスファイルからデータをロードするには:古いAPIは同様に私はJSON-とピクルス・ファイルの両方を処理する必要がJSON-ファイルが可能なので

def load(fname, params_only=False): 
    simulation = find(fname) # find returns file name 
    try: 
     with open(simulation, 'r') as json_file: 
      return json.load(json_file) 
    except (UnicodeDecodeError, ValueError) as e: 
     with open(simulation, 'rb') as pickle_file: 
      params = pickle.load(pickle_file) 
      if params_only: 
       return params 
      return pickle.load(pickle_file) 

オブジェクトのダンプは、必要に応じて機能します(エラーメッセージは表示されません)。コードは、Python 3.4.3を使用してのMacOSとLinuxのミントの両方で正常に動作している

[2016-08-07 14:39:34,637] ERROR in app: Exception on /api/simulations/20160807_123707581/heatflux_distribution.png [GET] 
Traceback (most recent call last): 
File "/home/abkos/abkosproject/abkos/_tools.py", line 36, in load 
    return json.load(json_file) 
File "/usr/lib/python3.4/json/__init__.py", line 265, in load 
    return loads(fp.read(), 
File "/usr/lib/python3.4/codecs.py", line 319, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1988, in wsgi_app 
    response = self.full_dispatch_request() 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1641, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1544, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py", line 33, in reraise 
    raise value 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1639, in full_dispatch_request 
    rv = self.dispatch_request() 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1625, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "./app.py", line 118, in plot_figure 
    img = plotter(identifier, figname, request.args.items()) 
File "./app.py", line 122, in plotter 
    sim = Simulation.from_file(identifier) 
File "/home/abkos/abkosproject/abkos/calculation.py", line 56, in from_file 
    params_or_simulation = load(fname, params_only=new) 
File "/home/abkos/abkosproject/abkos/_tools.py", line 42, in load 
    return pickle.load(pickle_file) 
_pickle.UnpicklingError 
10.0.2.2 - - [07/Aug/2016 14:39:34] "GET /api/simulations/20160807_123707581/heatflux_distribution.png HTTP/1.1" 500 - 
[2016-08-07 14:39:38,691] ERROR in app: Exception on /api/simulations/20160807_123707581/heatmap_axial_temperatures.png [GET] 
Traceback (most recent call last): 
File "/home/abkos/abkosproject/abkos/_tools.py", line 36, in load 
    return json.load(json_file) 
File "/usr/lib/python3.4/json/__init__.py", line 265, in load 
    return loads(fp.read(), 
File "/usr/lib/python3.4/codecs.py", line 319, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1988, in wsgi_app 
    response = self.full_dispatch_request() 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1641, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1544, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py", line 33, in reraise 
    raise value 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1639, in full_dispatch_request 
    rv = self.dispatch_request() 
File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1625, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "./app.py", line 118, in plot_figure 
    img = plotter(identifier, figname, request.args.items()) 
File "./app.py", line 122, in plotter 
    sim = Simulation.from_file(identifier) 
File "/home/abkos/abkosproject/abkos/calculation.py", line 56, in from_file 
    params_or_simulation = load(fname, params_only=new) 
File "/home/abkos/abkosproject/abkos/_tools.py", line 42, in load 
    return pickle.load(pickle_file) 
EOFError 
10.0.2.2 - - [07/Aug/2016 14:39:38] "GET /api/simulations/20160807_123707581/heatmap_axial_temperatures.png HTTP/1.1" 500 - 

:しかし、いくつかのデータを要求するときには、APIは次のエラーを発生させ、データをunpickle化する必要があるグラフ。しかし、Ubuntu 14.04(Python 3.4.3)では動作しません。

どこでエラーを調査するのですか?

答えて

0

私はどのコーディングエラーも見つけられなかったので、私は3つのシステムをお互いに比較し、ソフトウェアの視点とほとんど同じであることを見出しました。それらのすべてがPython 3.4.3 64ビットを使用しており、pickleはPythonのデフォルトモジュールの一部です。

だから、これはハードウェアに関連する問題かもしれないという結論に達しました。 MacOSマシンとミントマシンは両方とも「実」マシンであり、UbuntuはVMだけであるため、CPUとRAMのような一般的なハードウェア仕様を比較しました。

実際のマシンには8 GBのRAMが搭載されています。ミント1の場合は12 GB。だから、私はVMのRAMを約1GBから3GBに増やし、すべて正常に動作します。

したがって、MemoryErrorまたはそれに類するものがなかったとしても、EOFErrorはメモリーに関連する可能性があります。

関連する問題