← retour aux snippets

os.sendfile: copie de fichier zéro-copie (Unix)

Copier efficacement entre des descripteurs de fichiers sans buffer utilisateur.

python filesystem #os#sendfile#performance

objectif

Copier efficacement entre des descripteurs de fichiers sans buffer utilisateur.

code minimal

import os, tempfile, pathlib, shutil
with tempfile.TemporaryDirectory() as tmp:
    src = pathlib.Path(tmp)/"a"; dst = pathlib.Path(tmp)/"b"
    src.write_bytes(b"x"*1024)
    if hasattr(os, "sendfile"):
        with src.open("rb") as fsrc, dst.open("wb") as fdst:
            sent = os.sendfile(fdst.fileno(), fsrc.fileno(), 0, os.path.getsize(src))
        print(dst.stat().st_size == src.stat().st_size)  # attendu: True
    else:
        shutil.copyfile(src, dst)
        print(dst.read_bytes() == src.read_bytes())

utilisation

import os, tempfile, pathlib
with tempfile.TemporaryDirectory() as tmp:
    p = pathlib.Path(tmp)/"z"; p.write_bytes(b"data")
    ok = True if p.exists() else False
    print(ok)

variante(s) utile(s)

import os
print(hasattr(os, "sendfile"))

notes

  • Disponible sur de nombreuses plateformes Unix; fallback nécessaire ailleurs.
  • Idéal pour serveurs de fichiers ou proxies simples.