#!/usr/bin/python3
from io import StringIO, BytesIO


# Old
def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)


# New
def _copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    write = fdst.write
    if hasattr(fsrc, 'readinto') and length > 0:
        buf = memoryview(bytearray(length))
        readinto = fsrc.readinto
        while 1:
            recv_len = readinto(buf)
            if recv_len < length:
                # write remaining content if any.
                write(buf[:recv_len])
                break
            write(buf)
    else:
        read = fsrc.read
        while 1:
            buf = read(length)
            if not buf:
                break
            write(buf)


value = bytearray([0]*107374182)  # 100mb
# value = bytearray([0]*536870912)  # 500mb
with BytesIO(value) as fsrc:
    with BytesIO() as fdst:
        copyfileobj(fsrc, fdst)