如果 sacred 无法连接到MongoDB,如何导入 pickle 文件
How to import the pickle file if sacred failed to connect to MongoDB
实验软件sacred was run without MongoDB in the background with a configured mongo-observer。当它尝试将设置写入 MongoDB 时失败,创建文件 /tmp/sacred_mongo_fail__eErwU.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
如何手动将此 pickle 文件导入 MongoDB?
- 加载 pickle 文件,
- 设置
_id
,
- 插入
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
按顺序列出对象,并且可以使用 Cleanest way to get last item from Python iterator 而不是 list(...)[-1]
,但它应该可以工作。
实验软件sacred was run without MongoDB in the background with a configured mongo-observer。当它尝试将设置写入 MongoDB 时失败,创建文件 /tmp/sacred_mongo_fail__eErwU.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
如何手动将此 pickle 文件导入 MongoDB?
- 加载 pickle 文件,
- 设置
_id
, - 插入
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
按顺序列出对象,并且可以使用 Cleanest way to get last item from Python iterator 而不是 list(...)[-1]
,但它应该可以工作。