import time import numpy as np import pandas as pd import pyarrow as pa def generate_data(total_size, ncols): nrows = total_size / ncols / np.dtype('float64').itemsize return pd.DataFrame({ 'c' + str(i): np.random.randn(nrows) for i in range(ncols) }) KILOBYTE = 1 << 10 MEGABYTE = KILOBYTE * KILOBYTE DATA_SIZE = 1024 * MEGABYTE NCOLS = 16 def get_timing(f, niter): start = time.clock_gettime(time.CLOCK_REALTIME) for i in range(niter): f() return (time.clock_gettime(time.CLOCK_REALTIME) - start) / NITER def read_as_dataframe(klass, source): reader = klass(source) table = reader.read_all() return table.to_pandas() NITER = 5 results = [] CHUNKSIZES = [16 * KILOBYTE, 64 * KILOBYTE, 256 * KILOBYTE, MEGABYTE, 16 * MEGABYTE] for chunksize in CHUNKSIZES: nchunks = DATA_SIZE // chunksize batch = pa.RecordBatch.from_pandas(generate_data(chunksize, NCOLS)) sink = pa.InMemoryOutputStream() stream_writer = pa.StreamWriter(sink, batch.schema) for i in range(nchunks): stream_writer.write_batch(batch) source = sink.get_result() elapsed = get_timing(lambda: read_as_dataframe(pa.StreamReader, source), NITER) result = (chunksize, elapsed) print(result) results.append(result)