¿Método lento para leer Big File en Python?



Answers

Si su computadora, sistema operativo y python son de 64 bits , puede usar el módulo mmap para asignar el contenido del archivo a la memoria y acceder a él con índices y sectores. Aquí un ejemplo de la documentación:

import mmap
with open("hello.txt", "r+") as f:
    # memory-map the file, size 0 means whole file
    map = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print map.readline()  # prints "Hello Python!"
    # read content via slice notation
    print map[:5]  # prints "Hello"
    # update content using slice notation;
    # note that new content must have same size
    map[6:] = " world!\n"
    # ... and read again using standard file methods
    map.seek(0)
    print map.readline()  # prints "Hello  world!"
    # close the map
    map.close()

Si su computadora, sistema operativo o python son de 32 bits , entonces, mapear archivos grandes puede reservar grandes partes de su espacio de direcciones y starve su programa de memoria.

Question

Tengo un archivo muy grande de 4GB y cuando intento leerlo, mi computadora se cuelga. Así que quiero leerlo pieza por pieza y luego de procesar cada pieza, almacenar la pieza procesada en otro archivo y leer la siguiente pieza.

¿Hay algún método para yield estas piezas?

Me encantaría tener un método perezoso .




f = ... # file-like object, i.e. supporting read(size) function and 
        # returning empty string '' when there is nothing to read

def chunked(file, chunk_size):
    return iter(lambda: file.read(chunk_size), '')

for data in chunked(f, 65536):
    # process the data

ACTUALIZACIÓN: El enfoque se explica mejor en https://.com/a/4566523/38592







Para procesar línea por línea, esta es una solución elegante:

  def stream_lines(file_name):
    file = open(file_name)
    while True:
      line = file.readline()
      if not line:
        file.close()
        break
      yield line

Mientras no haya líneas en blanco.




No tengo permitido comentar debido a mi baja reputación, pero la solución SilentGhosts debería ser mucho más fácil con file.readlines ([sizehint])

métodos de archivo python

editar: SilentGhost tiene razón, pero debería ser mejor que:

s = "" 
for i in xrange(100): 
   s += file.next()



Links