Uso eficiente de la memoria en Python con Zero-copy
Python hace mucha magia con la memoria por debajo, y casi siempre lo hace de la peor manera posible.
Algo tan tonto como leer un fichero por trozos se te va de las manos si no tienes un par de cosas en cuenta.
Mira este código:
def read_binary():
with open("my_file.bin", "rb") as source:
content = source.read(1024 * 10000)
# Read the rest of the file in memory. This is inefficient
content_to_write = content[1024:]
with open("output.bin", "wb") as target:
target.write(content_to_write)
# Call the function
read_binary()
La lectura te reserva 10 MB, y luego content_to_write te hace una copia entera en memoria a partir del elemento 1024. ¿Te acordabas de la magia de Python? Pues aquí la tienes :)
Para estas cosas está Zero-copy.
Zero-copy es una forma de mover datos del disco o de la red a memoria sin que la CPU tenga que tocarlos por el camino. Rápido y sin gastar de más.
En Python lo tienes con memoryview.
Este es el mismo código de antes, pero con zero-copy:
def read_binary():
content_to_write = None
with open("my_file.bin", "rb") as source:
content = source.read(1024 * 10000)
# Zero-copy here
content_to_write = memoryview(content)[1024:]
with open("output.bin", "wb") as target:
target.write(content_to_write)
read_binary()
Ahora la lectura reserva los mismos 10 MB, pero los reutiliza: content_to_write ya no se lleva una copia de los datos, solo una referencia a lo que ya está en memoria.