Uso eficiente de la memoria en Python con Zero-copy
Python hace mucha magia con la memoria bajo el capó y, en la mayoría de los casos, de manera ineficiente.
Una tarea simple que lee un archivo en trozos es ineficiente si no se tienen en cuenta algunas cosas.
Digamos que tenemos 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 operación de lectura asigna 10 MB, y la segunda operación, content_to_write
, crea una copia de memoria de los primeros 1024 elementos en memoria. ¿Recuerdas la magia de Python? Aquí está :)
Podemos usar Zero-copy para mejorar este tipo de tareas.
Zero-copy es un método para copiar datos del disco/red a la memoria sin pasar por la CPU. Por lo tanto, es rápido y eficiente.
En Python, puedes usar Zero-copy usando memoryview
.
Considera el código anterior usando 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()
En este caso, la operación de lectura asigna 10 MB y lo reutiliza porque no copia datos en content_to_write
. En su lugar, copia una referencia.