2017-07-02 3 views
0

Le logiciel d'expérience sacred a été exécuté sans MongoDB en arrière-plan avec un mongo-observer configuré. Quand il a essayé d'écrire les paramètres à MongoDB, cela a échoué, la création du fichier /tmp/sacred_mongo_fail__eErwU.pickle, avec le messageComment importer le fichier pickle si sacré n'a pas réussi à se connecter à MongoDB

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 

Comment ce fichier cornichon peut être importé dans MongoDB manuellement?

Répondre

0
  1. Chargez le fichier de conserves au vinaigre,
  2. mis l'_id,
  3. insert

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) 

C'est rapide et sale, dépend de la find à la liste des objets dans l'ordre , et pourrait utiliser Cleanest way to get last item from Python iterator au lieu de list(...)[-1], mais cela devrait fonctionner.

+0

J'ai l'impression que cette réponse est sur la bonne voie, mais cela n'a pas fonctionné pour moi. Pour commencer, mon expérience dans le fichier pickle avait déjà un champ '_id', et la commande open a besoin de l'argument 'rb' pour s'ouvrir comme binaire dans python3 ... mais même avec ça, même si la commande insert_one ne retourne pas une erreur, il ne met pas réellement à jour l'enregistrement (existant) dans la base de données. Des idées? – clemej

+0

@clemej: si le '_id' existe déjà, vous pouvez' find_one_and_update'. Voir https://stackoverflow.com/a/46608956/1587329 etc. –