[Libguestfs] [PATCH nbdkit] python: Pass memoryview to pwrite()
Richard W.M. Jones
rjones at redhat.com
Mon Nov 25 09:57:13 UTC 2019
On Sat, Nov 23, 2019 at 05:49:05PM +0200, Nir Soffer wrote:
> Passing a memoryview we avoid unneeded copy of the original buffer. On
> the python side memoryview object can be used for slicing, writing to
> file, or sending to socket.
>
> This may break plugins assuming that the they get a bytearray, but
> good python code should not care about the type of the buffer, only
> about the behaviour.
>
> Testing with a plugin writing to /dev/null shows 2.7x speedup. Real
> plugin will probably show much smaller improvement.
>
> Without patch:
>
> $ time qemu-img convert -p -f raw -O raw -n /var/tmp/disk.img nbd://localhost/
> (100.00/100%)
>
> real 0m1.284s
> user 0m0.091s
> sys 0m0.576s
>
> With patch:
>
> $ time qemu-img convert -p -f raw -O raw -n /var/tmp/disk.img nbd://localhost/
> (100.00/100%)
>
> real 0m0.477s
> user 0m0.078s
> sys 0m0.653s
> ---
>
> More info on how I tested this:
>
> # Creating test image
> $ dd if=/dev/zero bs=1M count=1024 | tr "\0" "U" > /var/tmp/disk.img
>
> $ cat zero.py
> import builtins
>
> def open(readonly):
> return builtins.open("/dev/zero", "r+b")
>
> def get_size(h):
> return 1024**3
>
> def pwrite(h, buf, offset):
> h.write(buf)
>
> def pread(h, count, offset):
> raise NotImplementedError
>
> def close(h):
> h.close()
>
> # Running nbdkit
> $ ./nbdkit -f -v python zero.py
>
> plugins/python/python.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/plugins/python/python.c b/plugins/python/python.c
> index 214fffb..2b4361a 100644
> --- a/plugins/python/python.c
> +++ b/plugins/python/python.c
> @@ -496,8 +496,8 @@ py_pwrite (void *handle, const void *buf,
> PyErr_Clear ();
>
> r = PyObject_CallFunction (fn, "ONL", obj,
> - PyByteArray_FromStringAndSize (buf, count),
> - offset, NULL);
> + PyMemoryView_FromMemory ((char *)buf, count, PyBUF_READ),
> + offset, NULL);
> Py_DECREF (fn);
> if (check_python_failure ("pwrite") == -1)
> return -1;
I had a second look at this patch this morning, and at how Python 3
memoryview works, and I think we should accept this. Callers (even v1
callers) should be prepared for any buffer type object. It also seems
to work with v2v.
Therefore ACK.
Thanks,
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
More information about the Libguestfs
mailing list