Tengo varios script que se ejecuta en un servidor que pepinillos y unpickle diversos diccionarios. Todos ellos utilizan el mismo código básico para el decapado como se muestra a continuación:

SellerDict=open('/home/hostadl/SellerDictkm','rb')
SellerDictionarykm=pickle.load(SellerDict)
SellerDict.close()

SellerDict=open('/home/hostadl/SellerDictkm','wb')
pickle.dump(SellerDictionarykm,SellerDict)
SellerDict.close()

Todas las secuencias de comandos se ejecutan bien, excepto por uno de ellos. El que tiene problemas va a varios sitios web y las raspaduras de datos y los almacena en el diccionario. Este código se ejecuta durante todo el día decapado y unpickling diccionarios y deja a la medianoche. Un cronjob, a continuación, comienza de nuevo
a la mañana siguiente. Esta secuencia de comandos se pueden ejecutar durante semanas sin tener un problema, pero una vez al mes, la secuencia de comandos muere debido a un EOFError cuando se intenta abrir un diccionario. El tamaño de los diccionarios son generalmente alrededor de 80 MB. Incluso he intentado añadir SellerDict.flush() antes de SellerDict.close() cuando el decapado de los datos para asegurarse de que la noche se estaba vacía.

Cualquier idea de qué podría estar causando esto? Python es bastante sólido, así que no creo que es debido al tamaño del archivo. Cuando el código se ejecuta correctamente durante un largo tiempo antes de morir me lleva a creer que tal vez algo se guarda en el diccionario que está causando este problema, pero no tengo idea.

También, si usted sabe de una mejor manera para guardar los diccionarios de otros que pickle estoy abierto a opciones. Como he dicho antes, los diccionarios están siendo constantemente abierto y cerrado. Sólo una aclaración, sólo un programa utilizará el mismo diccionario, de modo que el problema no está causado por varios programas que intentan acceder al mismo diccionario.

ACTUALIZACIÓN:

Aquí es la traza que tengo de un archivo de registro.

Traceback (most recent call last):
  File "/home/hostadl/CompileRecentPosts.py", line 782, in <module>
    main()
  File "/home/hostadl/CompileRecentPosts.py", line 585, in main
    SellerDictionarykm=pickle.load(SellerDict)
EOFError
  • Estás utilizando cualquier tipo de estrategia de bloqueo?
  • No estoy usando ningún bloqueo de estrategias de…
InformationsquelleAutor jordanskis | 2012-04-21

2 Comentarios

  1. 6

    Así que esto en realidad resultó ser un problema de memoria. Cuando el equipo se quedaría sin la RAM y tratar de unpickle o cargar los datos, el proceso podría fallar alegando que este EOFError. Puedo aumentar la memoria RAM en el equipo y eso nunca fue un problema nuevo.

    Gracias por todos los comentarios y ayuda.

    • cómo de grande, en promedio, son los diccionarios son decapado y unpickling?
  2. 3

    Esto es lo que sucede cuando no se utiliza el bloqueo:

    import pickle
    
    # define initial dict
    orig_dict={'foo':'one'}
    
    # write dict to file
    writedict_file=open('./mydict','wb')
    pickle.dump(orig_dict,writedict_file)
    writedict_file.close()
    
    # read the dict from file
    readdict_file=open('./mydict','rb')
    mydict=pickle.load(readdict_file)
    readdict_file.close()
    
    # now we have new data to save
    new_dict={'foo':'one','bar':'two'}
    writedict_file=open('./mydict','wb')
    #pickle.dump(orig_dict,writedict_file)
    #writedict_file.close()
    
    # but...whoops!  before we could save the data
    # some other reader tried opening the file
    # now they are having a problem
    readdict_file=open('./mydict','rb')
    mydict=pickle.load(readdict_file) # errors out here
    readdict_file.close()

    Aquí está el resultado:

    python pickletest.py
    Traceback (most recent call last):
      File "pickletest.py", line 26, in <module>
        mydict=pickle.load(readdict_file) # errors out here
      File "/usr/lib/python2.6/pickle.py", line 1370, in load
        return Unpickler(file).load()
      File "/usr/lib/python2.6/pickle.py", line 858, in load
        dispatch[key](self)
      File "/usr/lib/python2.6/pickle.py", line 880, in load_eof
        raise EOFError
    EOFError

    Eventualmente, algún proceso de lectura se va a tratar de leer el escabeche de archivo, mientras que un proceso de escritura que ya se ha abierto para escritura. Usted necesita asegurarse de que usted tiene alguna manera de saber si otro proceso ya tiene un archivo abierto para escritura antes de intentar leer de ella.

    Para una solución muy simple, tener una mirada en este hilo que trata sobre el uso de Filelock.

    • AJ, agradezco su respuesta. Sin embargo, sólo uno se utiliza el programa de cada diccionario. Así que nunca hay otro proceso que está tratando de leer o abrir un diccionario que el proceso actual es el uso o por escrito.
    • Se puede incluir un completo rastreo en tu pregunta?
    • He actualizado a la pregunta original, con una rastreabilidad. Gracias por su ayuda!

Dejar respuesta

Please enter your comment!
Please enter your name here