para darle contexto:¿Lectura de múltiples datos en escabeche de Python a la vez, almacenamiento en búfer y nuevas líneas?
Tengo un gran archivo f
, varios conciertos en el tamaño. Contiene pepinillos consecutivos de diferentes objetos que se generaron mediante la ejecución de
for obj in objs: cPickle.dump(obj, f)
quiero tomar ventaja de búfer cuando se lee este archivo. Lo que quiero es leer varios objetos recogidos en un búfer a la vez. Cual es la mejor manera de hacer esto? Quiero un análogo de para datos en escabeche. De hecho, si los datos recogidos son de hecho delimitados por una línea nueva, uno podría usar las líneas de lectura, pero no estoy seguro de si eso es cierto.
Otra opción que tengo en mente es dumps()
primero el objeto escabechado en una cadena y luego escribir las cadenas en un archivo, cada uno separado por una nueva línea. Para volver a leer el archivo, puedo usar readlines()
y loads()
. Pero me temo que un objeto escabechado puede tener el carácter "\n"
y arrojará este esquema de lectura de archivos. ¿Es mi miedo infundado?
Una opción es extraerla como una gran lista de objetos, pero eso requerirá más memoria de la que puedo permitir. La configuración se puede acelerar mediante multi-threading, pero no quiero ir allí antes de que el buffer funcione correctamente. ¿Cuál es la "mejor práctica" para situaciones como esta?
EDIT: También puedo leer en bytes sin formato en un búfer e invocar cargas sobre eso, pero necesito saber cuántos bytes de ese búfer consumieron las cargas para que pueda tirar la cabeza.
No debería estar ya amortiguar sucediendo detrás de las escenas. También los hilos no ayudarán. –
Si tiene control sobre la creación del archivo pickle, probablemente podría hacerlo mucho más pequeño usando 'pickle.dump (obj, f, pickle.HIGHEST_PROTOCOL)' (o el equivalente 'pickle.dump (obj, f, -1) ') que es un protocolo binario y mucho más compacto que el ASCII predeterminado que está recibiendo. Tener un archivo mucho más pequeño podría mitigar las preocupaciones sobre el almacenamiento en búfer. De hecho, probablemente significaría que "buscar líneas que terminen en truco' '. \ N'' "en la [respuesta] de @Kirk Strauser (http://stackoverflow.com/a/5507750/355230) no funcionaría. – martineau