Apache Arrow рдХреЛ рд╕рд╛рде рд╕реНрддрдореНрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ

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

Apache Arrow рдХреЛ рд╕рд╛рде рд╕реНрддрдореНрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ

рдкрдЫрд┐рд▓реНрд▓рд╛ рдХреЗрд╣реА рд╣рдкреНрддрд╛рд╣рд░реВрдорд╛, рд╣рд╛рдореА рдиреЛрдЩ рд▓рд┐ рдорд╛ рдердкрд┐рдпреЛ Apache рддреАрд░ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдо рдврд╛рдБрдЪрд╛, рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрд╡рд╕реНрдерд┐рдд рдЕрдирд┐рдпрдорд┐рдд рдкрд╣реБрдБрдЪ/IPC рдлрд╛рдЗрд▓ рдврд╛рдБрдЪрд╛рдХреЛ рдкреВрд░рдХред рд╣рд╛рдореАрд╕рдБрдЧ Java рд░ C++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░ рдкрд╛рдЗрдерди рдмрд╛рдЗрдиреНрдбрд┐рдЩрд╣рд░реВ рдЫрдиреНред рдпрд╕ рд▓реЗрдЦрдорд╛, рдо рдврд╛рдБрдЪрд╛рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреБ рд░ рддрдкрд╛рдЗрдБ рдХрд╕рд░реА рдкрд╛рдиреНрдбрд╛ рдбрд╛рдЯрд╛рдлреНрд░реЗрдордХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рдЙрдЪреНрдЪ рдбреЗрдЯрд╛ рдереНрд░реБрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБред

рд╕реНрддрдореНрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ

рдПрд░реЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдмрд╛рдЯ рдореИрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдХреЛ рдПрдЙрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рднрдиреЗрдХреЛ рдкрдЩреНрдХреНрддрд┐- рд╡рд╛ рд░реЗрдХрд░реНрдб-рдЙрдиреНрдореБрдЦ рдврд╛рдБрдЪрд╛рдмрд╛рдЯ рд╕реНрддрдореНрдн рдврд╛рдБрдЪрд╛рдорд╛ рдареВрд▓рд╛ рдЯреНрдпрд╛рдмреБрд▓рд░ рдбреЗрдЯрд╛рд╕реЗрдЯрд╣рд░реВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдЧрд░реНрдиреЗ рдЙрдЪреНрдЪ рд▓рд╛рдЧрдд рд╣реЛред рдмрд╣реБ-рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдореЗрдореЛрд░реАрдорд╛ рд╡рд╛ рдбрд┐рд╕реНрдХрдорд╛ рдЯреНрд░рд╛рдиреНрд╕рдкреЛрдЬрд┐рдЩ рднрд╛рд░реА рд╣реБрди рд╕рдХреНрдЫред

рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдбреЗрдЯрд╛рдХрд╛ рд▓рд╛рдЧрд┐, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдкрдЩреНрдХреНрддрд┐ рд╣реЛрд╕реН рд╡рд╛ рд╕реНрддрдореНрдн, рдПрдЙрдЯрд╛ рд╡рд┐рдХрд▓реНрдк рднрдиреЗрдХреЛ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВрдХреЛ рд╕рд╛рдиреЛ рдмреНрдпрд╛рдЪрд╣рд░реВ рдкрдард╛рдЙрдиреБ рд╣реЛ, рдкреНрд░рддреНрдпреЗрдХрдорд╛ рдЖрдиреНрддрд░рд┐рдХ рд░реВрдкрдорд╛ рд╕реНрддрдореНрдн рд▓реЗрдЖрдЙрдЯ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреНрдЫред

Apache Arrow рдорд╛, рдЗрди-рдореЗрдореЛрд░реА рд╕реНрддрдореНрдн рдПрд░реЗрд╣рд░реВрдХреЛ рд╕рдЩреНрдХрд▓рдирд▓реЗ рдЯреЗрдмрд▓рдХреЛ рднрд╛рдЧрд▓рд╛рдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рд░реЗрдХрд░реНрдб рдмреНрдпрд╛рдЪ рднрдирд┐рдиреНрдЫред рддрд╛рд░реНрдХрд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдПрдХрд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рд░реЗрдХрд░реНрдбрдХрд╛ рдзреЗрд░реИ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

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

рдмрд┐рднрд┐рдиреНрди рдврд╛рдБрдЪрд╛рд╣рд░реВ рдпреЛ рдЪрд┐рддреНрд░ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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 GB рдбрд╛рдЯрд╛ рд▓реЗрдЦреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдкреНрд░рддреНрдпреЗрдХрдорд╛ 1 MB рдЦрдгреНрдбрд╣рд░реВ, рдХреБрд▓ 1024 рдЦрдгреНрдбрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред рдкрд╣рд┐рд▓реЗ, резрем рд╕реНрддрдореНрднрд╣рд░реВрд╕рдБрдЧ рдкрд╣рд┐рд▓реЛ 1MB рдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:

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

рдпреЛ рд╕рдмреИ, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд░рд╛рдореНрд░реЛ рдЫ, рддрд░ рддрдкрд╛рдИрдВ рдкреНрд░рд╢реНрди рд╣реБрди рд╕рдХреНрдЫред рдпреЛ рдХрддрд┐ рдЫрд┐рдЯреЛ рд╣реБрдиреНрдЫ? chunk рд╕рд╛рдЗрдЬрд▓реЗ рдкрд╛рдиреНрдбрд╛ рдбрд╛рдЯрд╛рдлреНрд░реЗрдо рдкреБрди: рдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдЫ?

рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдкреНрд░рджрд░реНрд╢рди

рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдЦрдгреНрдбрдХреЛ рдЖрдХрд╛рд░ рдШрдЯреНрджреИ рдЬрд╛рдБрджрд╛, рдкрд╛рдгреНрдбрд╛рдорд╛ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╕реНрддрдореНрдн рдбрд╛рдЯрд╛рдлреНрд░реЗрдордХреЛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдгрдХреЛ рд▓рд╛рдЧрдд рдЕрдХреБрд╢рд▓ рдХреНрдпрд╛рд╕ рдкрд╣реБрдБрдЪ рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рдХрд╛рд░рдг рдмрдвреНрдЫред рддреНрдпрд╣рд╛рдБ C++ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВ рд░ arrays рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдореЗрдореЛрд░реА рдмрдлрд░рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреЗрд╣реА рдУрднрд░рд╣реЗрдб рдкрдирд┐ рдЫред

рдорд╛рдерд┐рдХреЛ рд░реВрдкрдорд╛ 1 MB рдХреЛ рд▓рд╛рдЧрд┐, рдореЗрд░реЛ рд▓реНрдпрд╛рдкрдЯрдкрдорд╛ (рдХреНрд╡рд╛рдб-рдХреЛрд░ Xeon E3-1505M) рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ:

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

рдпрд╕рд▓реЗ 7.75 1 MB рдЦрдгреНрдбрд╣рд░реВрдмрд╛рдЯ 1024 GB рдбрд╛рдЯрд╛рдлреНрд░реЗрдо рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдереНрд░реБрдкреБрдЯ 1 Gb/s рд╣реЛред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдареВрд▓рд╛ рд╡рд╛ рд╕рд╛рдиреЛ рдЯреБрдХреНрд░рд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ? рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реБрдиреЗ рдирддрд┐рдЬрд╛рд╣рд░реВ рдпрд╣рд╛рдБ рдЫрдиреН:

Apache Arrow рдХреЛ рд╕рд╛рде рд╕реНрддрдореНрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ

рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди 256K рдмрд╛рдЯ 64K рднрд╛рдЧрд╣рд░реВрдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдШрдЯреНрдЫред рдо рдЫрдХреНрдХ рдкрд░реЗрдВ рдХрд┐ 1MB рдЦрдгреНрдбрд╣рд░реВ 16MB рдЦрдгреНрдбрд╣рд░реВ рднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдпреЛред рдпреЛ рдПрдХ рдердк рдЧрд╣рд┐рд░реЛ рдЕрдзреНрдпрдпрди рдЧрд░реНрди рд▓рд╛рдпрдХ рдЫ рд░ рдпреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рд╣реЛ рд╡рд╛ рдХреЗрд╣рд┐ рдЕрдиреНрдп рд╕рдорд╛рд╡реЗрд╢ рдЫ рднрдиреЗрд░ рдмреБрдЭреНрдиред

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

рдкрд░рд┐рдгрд╛рдо

рд╕реНрддрдореНрдн рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ рдареВрд▓рд╛ рдбрд╛рдЯрд╛рд╕реЗрдЯрд╣рд░реВрд▓рд╛рдИ рд╕реНрддрдореНрдн рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдгрд╣рд░реВрдорд╛ рд╕рд╛рдирд╛ рдЯреБрдХреНрд░рд╛рд╣рд░реВрдорд╛ рдкрд╛рдиреНрдбрд╛рд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рддрд░рд┐рдХрд╛ рд╣реБрди рд╕рдХреНрдЫред рдкрдЩреНрдХреНрддрд┐-рдЙрдиреНрдореБрдЦ рднрдгреНрдбрд╛рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛рд╣рд░реВрд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░рдХреЛ 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)

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди