2017-07-02 20 views
0

実験ソフトウェアsacredは、MongoDBなしでバックグラウンドで構成されたmongo-observerで実行されました。それはMongoDBのに設定を書き込みしようとしたとき、これは、メッセージで、ファイル/tmp/sacred_mongo_fail__eErwU.pickleを作成し、失敗したsacredがMongoDBへの接続に失敗した場合のpickleファイルのインポート方法

Warning: saving to MongoDB failed! Stored experiment entry in /tmp/sacred_mongo_fail__eErwU.pickle 
Traceback (most recent calls WITHOUT Sacred internals): 
    File "/usr/local/lib/python2.7/dist-packages/sacred/observers/mongo.py", line 127, in started_event 
    self.run_entry[experiment][sources] = self.save_sources(ex_info) 
    File "/usr/local/lib/python2.7/dist-packages/sacred/observers/mongo.py", line 239, in save_sources 
    file = self.fs.find_one({filename: abs_path, md5: md5}) 
    File "/usr/local/lib/python2.7/dist-packages/gridfs/__init__.py", line 261, in find_one 
    for f in self.find(filter, *args, **kwargs): 
    File "/usr/local/lib/python2.7/dist-packages/gridfs/grid_file.py", line 658, in next 
    next_file = super(GridOutCursor, self).next() 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1114, in next 
    if len(self.__data) or self._refresh(): 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1036, in _refresh 
    self.__collation)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 873, in __send_message 
    **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 888, in _send_message_with_response 
    server = topology.select_server(selector) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 214, in select_server 
    address)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 189, in select_servers 
    self._error_message(selector)) 
ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused 

どのようにこの漬物ファイルは手動でのMongoDBにインポートすることができますか?

答えて

0
  1. _idを設定し、ピクルスファイルをロードし、
  2. これは、迅速かつ汚いです

db = pymongo.MongoClient().sacred 
entry = pickle.load(open('/tmp/sacred_mongo_fail__eErwU.pickle')) 
entry['_id'] = list(db.runs.find({}, {"_id": 1}))[-1]['_id'] 
db.runs.insert_one(entry) 

を挿入し、順番にオブジェクトを一覧表示するfindに依存list(...)[-1]の代わりにCleanest way to get last item from Python iteratorを使用できますが、動作するはずです。

+0

私はこの答えが正しかったと思っていますが、それは私のために働いていません。まず、pickleファイルの私の実験は既に '_id'フィールドを持っていて、openコマンドはpython3でバイナリとして開くために 'rb'引数を必要とします...それでも、insert_oneコマンドは戻りませんエラーが発生した場合、db内の(既存の)レコードは実際には更新されません。何か案は? – clemej

+0

@clemej: '_id'がすでに存在する場合は、' find_one_and_update'を実行できます。 https://stackoverflow.com/a/46608956/1587329などを参照してください。 –

関連する問題