Apache Arrow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рдо рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рдирд╛

рдбреЗрдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред




рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ, рдиреЛрдВрдЧ рд▓реА рдФрд░ рдореИрдВрдиреЗ рдЕрдкрд╛рдЪреЗ рдПрд░реЛ рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рдЬреЛрдбрд╝рд╛ рд╣реИ , рдЬреЛ рдореМрдЬреВрджрд╛ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ / рдЖрдИрдкреАрд╕реА рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА ++ рдФрд░ рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкреНрд░рд╛рд░реВрдк рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдбреЗрдЯрд╛рдлреНрд░реИрдВрдб рдкрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдереНрд░реВрдкреБрдЯ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрддрдВрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ


рдПрд░реЛ рдпреВрдЬрд░реНрд╕ рд╕реЗ рдореБрдЭреЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдПрдХ рдкрдВрдХреНрддрд┐-рдЙрдиреНрдореБрдЦ рдпрд╛ рд░реЛ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдлреЙрд░реНрдореЗрдЯ рд╕реЗ рдХреЙрд▓рдо рдХреЙрд▓рдо рдХреЗ рдмрдбрд╝реЗ рд╕реЗрдЯ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рдХреА рдЙрдЪреНрдЪ рд▓рд╛рдЧрдд рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рдорд▓реНрдЯреА-рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдпрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд╛рдВрдЯ рдХрд░рдирд╛ рдПрдХ рднрд╛рд░реА рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рд╕реНрддрдВрдн рд╣реЛ, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЫреЛрдЯреЗ рдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдХреЙрд▓рдо рд▓реЗрдЖрдЙрдЯ рд╣реЛрддрд╛ рд╣реИред

рдЕрдкрд╛рдЪреЗ рдПрд░реЛ рдореЗрдВ, рдЯреЗрдмрд▓ рдЪрдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрди-рдореЗрдореЛрд░реА рдХреЙрд▓рдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдмреИрдЪ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдПрдХрд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд░рд┐рдХреЙрд░реНрдб рдкреИрдХреЗрдЬ рдЗрдХрдЯреНрдареЗ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореМрдЬреВрджрд╛ "рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕" рдлрд╛рдЗрд▓ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ, рд╣рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЯреЗрдмрд▓ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХреНрд╕ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╕реЗ рдХрд┐рд╕реА рднреА рд░рд┐рдХреЙрд░реНрдб рдкреИрдХреЗрдЬ рдпрд╛ рдХрд┐рд╕реА рднреА рдХреЙрд▓рдо рдХреЛ рдмреЗрд╣рдж рд╕рд╕реНрддреЗ рдореЗрдВ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ, рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреЗрдЬрддреЗ рд╣реИрдВ: рдПрдХ рдпреЛрдЬрдирд╛, рдФрд░ рдлрд┐рд░ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреИрдХреЗрдЯред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдк рдХреБрдЫ рдЗрд╕ рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ:



PyArrow рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди


рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдПрдХрд▓ рд╕реНрдЯреНрд░реАрдо рдЪрдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛рдКрдВрдЧрд╛:

import time
import numpy as np
import pandas as pd
import pyarrow as pa

def generate_data(total_size, ncols):
    nrows = int(total_size / ncols / np.dtype('float64').itemsize)
    return pd.DataFrame({
        'c' + str(i): np.random.randn(nrows)
        for i in range(ncols)
    })	

рдЕрдм, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо 1 рдЬреАрдмреА рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 1 рдПрдордмреА рдХреА рдорд╛рддреНрд░рд╛ рд╣реИ, рдХреБрд▓ 1024 рдЪрдВрдХреНрд╕ рдХреЗ рд▓рд┐рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП резрем рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рез рдПрдордмреА рдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рдмрдирд╛рдПрдБ:

KILOBYTE = 1 << 10
MEGABYTE = KILOBYTE * KILOBYTE
DATA_SIZE = 1024 * MEGABYTE
NCOLS = 16

df = generate_data(MEGABYTE, NCOLS)

рддрдм рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ pyarrow.RecordBatch:

batch = pa.RecordBatch.from_pandas(df)

рдЕрдм рдореИрдВ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдКрдВрдЧрд╛ рдЬреЛ RAM рдХреЛ рд▓рд┐рдЦреЗрдЧрд╛ рдФрд░ рдмрдирд╛рдПрдЧрд╛ StreamWriter:

sink = pa.InMemoryOutputStream()
stream_writer = pa.StreamWriter(sink, batch.schema)

рдлрд┐рд░ рд╣рдо 1024 рдЪрдВрдХреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдВрддрддрдГ 1GB рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рдПрдЧрд╛:

for i in range(DATA_SIZE // MEGABYTE):
    stream_writer.write_batch(batch)

рдЪреВрдБрдХрд┐ рд╣рдордиреЗ RAM рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣рдо рдкреВрд░реА рдзрд╛рд░рд╛ рдХреЛ рдПрдХ рдмрдлрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

In [13]: source = sink.get_result()

In [14]: source
Out[14]: <pyarrow.io.Buffer at 0x7f2df7118f80>

In [15]: source.size
Out[15]: 1074750744

рдЪреВрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ, рдПрд░реЛ рд░рд┐рдХреЙрд░реНрдб рдкреИрдХреЗрдЯ рдХреЛ рдкрдврд╝рдирд╛ рд╢реВрдиреНрдп-рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рд╣реИред рдореИрдВ StreamReader рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реВрдВ, рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реВрдВ pyarrow.TableрдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ DataFrame pandas:

In [16]: reader = pa.StreamReader(source)

In [17]: table = reader.read_all()

In [18]: table
Out[18]: <pyarrow.table.Table at 0x7fae8281f6f0>

In [19]: df = table.to_pandas()

In [20]: df.memory_usage().sum()
Out[20]: 1073741904

рдпрд╣ рд╕рдм, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдкрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ?

рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди


рдЬреИрд╕реЗ рд╣реА рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЪрдВрдХ рдХрд╛ рдЖрдХрд╛рд░ рдШрдЯрддрд╛ рд╣реИ, рдЕрдХреНрд╖рдо рдХреИрд╢ рдПрдХреНрд╕реЗрд╕ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкрд╛рдВрдбрд╛ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреЙрд▓рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдмрдврд╝ рдЬрд╛рддреА рд╣реИред C ++ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреА рдореЗрдореЛрд░реА рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рднреА рд╣реИред

1 рдПрдордмреА рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ (рдХреНрд╡рд╛рдб-рдХреЛрд░ рдПрдХреНрд╕реЛрди E3-1505M) рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ:

In [20]: %timeit pa.StreamReader(source).read_all().to_pandas()
10 loops, best of 3: 129 ms per loop

рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡реА рдмреИрдВрдбрд╡рд┐рдбреНрде 7.75 рдЬреАрдмреА / рдПрд╕ рд╣реИ, рдЬреЛ 1 рдЬреАрдмреА рдбреЗрдЯрд╛ рдХрд╛ рдирд╛рдо 1 рдПрдордмреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ 1 рдПрдордмреА рдХреЗ 1 рдЬреАрдмреА рдбреЗрдЯрд╛ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрджрд┐ рд╣рдо рдмрдбрд╝реЗ рдпрд╛ рдЫреЛрдЯреЗ рд╡рд┐рдЦрдВрдбреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:



рдкреНрд░рджрд░реНрд╢рди 256K рд╕реЗ 64K рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЧрд┐рд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ 16 рдПрдордмреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1 рдПрдордмреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рддреЗрдЬреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реБрдЖред рдЕрдзрд┐рдХ рдЧрд╣рди рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рд╣реИ рдпрд╛ рдпрджрд┐ рдХреБрдЫ рдФрд░ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдбреЗрдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдВрдХреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрдореЛрд░реА рдФрд░ рддрд╛рд░реЛрдВ рдореЗрдВ рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╕рдВрдкреАрдбрд╝рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рдмрди рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг


рд╕реНтАНрддрдВрдн рдХреЙрд▓рдо рдбреЗрдЯрд╛ рдХреЛ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдХреЙрд▓рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЯреВрд▓, рдЬреИрд╕реЗ рдкрд╛рдВрдбрд╛, рдЫреЛрдЯреЗ рд╡рд┐рдЦрдВрдбреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓рд╛рдЗрди-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛рдПрдБ рдЙрди рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рд╡рд┐рдЦрдВрдбрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ L2 рдФрд░ L3 рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рдкреВрд░реНрдг рдХреЛрдб

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)

All Articles