Apache Arrow เชตเชกเซ‡ เช•เซ‰เชฒเชฎ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช—

เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช•เซ‹เชฐเซเชธเชจเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เชฎเชพเชŸเซ‡ เช–เชพเชธ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เชกเซ‡เชŸเชพ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐ.

Apache Arrow เชตเชกเซ‡ เช•เซ‰เชฒเชฎ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช—

เช›เซ‡เชฒเซเชฒเชพ เช•เซ‡เชŸเชฒเชพเช• เช…เช เชตเชพเชกเชฟเชฏเชพเชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช›เซ‡ เชจเซ‹เช‚เช— เชฒเชฟ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช…เชชเชพเชšเซ‡ เชเชฐเซ‹ เชฌเชพเชˆเชจเชฐเซ€ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชซเซ‹เชฐเซเชฎเซ‡เชŸ, เชนเชพเชฒเชจเชพ เชฐเซ‡เชจเซเชกเชฎ เชเช•เซเชธเซ‡เชธ/เช†เชˆเชชเซ€เชธเซ€ เชซเชพเช‡เชฒ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‡ เชชเซ‚เชฐเช• เชฌเชจเชพเชตเซ‡ เช›เซ‡. เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ Java เช…เชจเซ‡ C++ เช…เชฎเชฒเซ€เช•เชฐเชฃเซ‹ เช…เชจเซ‡ Python เชฌเชพเชˆเชจเซเชกเชฟเช‚เช—เซเชธ เช›เซ‡. เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เชธเชฎเชœเชพเชตเซ€เชถ เช•เซ‡ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเชคเชพเชตเซ€เชถ เช•เซ‡ เชคเชฎเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชพเช‚เชกเชพ เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เช‰เชšเซเชš เชกเซ‡เชŸเชพ เชฅเซเชฐเซเชชเซเชŸ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เช•เซ‰เชฒเชฎ เชกเซ‡เชŸเชพ

เชเชฐเซ‹ เชฏเซเชเชฐเซเชธ เชคเชฐเชซเชฅเซ€ เชฎเชจเซ‡ เชฎเชณเซ‡เชฒเซ‹ เชเช• เชธเชพเชฎเชพเชจเซเชฏ เชชเซเชฐเชถเซเชจ เช เชชเช‚เช•เซเชคเชฟ- เช…เชฅเชตเชพ เชฐเซ‡เช•เซ‹เชฐเซเชก-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚เชฅเซ€ เช•เซ‰เชฒเชฎ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชŸเซ‡เชฌเซเชฏเซเชฒเชฐ เชกเซ‡เชŸเชพเชจเชพ เชฎเซ‹เชŸเชพ เชธเซ‡เชŸเชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชŠเช‚เชšเซ€ เช•เชฟเช‚เชฎเชค เช›เซ‡. เชฎเชฒเซเชŸเซ€-เช—เซ€เช—เชพเชฌเชพเชˆเชŸ เชกเซ‡เชŸเชพเชธเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡, เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช…เชฅเชตเชพ เชกเชฟเชธเซเช• เชชเชฐ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเซเช‚ เช เชœเชฌเชฐเชœเชธเซเชค เช•เชพเชฐเซเชฏ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡.

เชกเซ‡เชŸเชพเชจเซ‡ เชธเซเชŸเซเชฐเซ€เชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชญเชฒเซ‡ เชธเซเชฐเซ‹เชค เชกเซ‡เชŸเชพ เชชเช‚เช•เซเชคเชฟ เชนเซ‹เชฏ เช•เซ‡ เช•เซ‰เชฒเชฎ, เชเช• เชตเชฟเช•เชฒเซเชช เช เช›เซ‡ เช•เซ‡ เชชเช‚เช•เซเชคเชฟเช“เชจเชพ เชจเชพเชจเชพ เชฌเซ…เชšเซ‡เชธ เชฎเซ‹เช•เชฒเซ‹, เชœเซ‡เชฎเชพเช‚ เชฆเชฐเซ‡เช• เช…เช‚เชฆเชฐ เชธเซเชคเช‚เชญเชพเช•เชพเชฐ เชฒเซ‡เช†เช‰เชŸ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เช…เชชเชพเชšเซ‡ เชเชฐเซ‹เชฎเชพเช‚, เชŸเซ‡เชฌเชฒเชจเชพ เชญเชพเช—เชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชคเซ€ เช‡เชจ-เชฎเซ‡เชฎเชฐเซ€ เช•เซ‰เชฒเชฎ เชเชฐเซ‡เชจเชพ เชธเช‚เช—เซเชฐเชนเชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เชฌเซ‡เชš เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชฒเซ‹เชœเชฟเช•เชฒ เชŸเซ‡เชฌเชฒเชจเชพ เชเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฐเซ‡เช•เซ‹เชฐเซเชกเชจเซ€ เช˜เชฃเซ€ เชฌเซ‡เชš เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชนเชพเชฒเชจเชพ "เชฐเซ‡เชจเซเชกเชฎ เชเช•เซเชธเซ‡เชธ" เชซเชพเชˆเชฒ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚, เช…เชฎเซ‡ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพเชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชฎเชพเช‚ เชŸเซ‡เชฌเชฒ เชธเซเช•เซ€เชฎเชพ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชซเชพเชˆเชฒเชจเชพ เช…เช‚เชคเซ‡ เชฌเซเชฒเซ‹เช• เชธเซเชฅเชพเชจเซ‹ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡เชจเชพเชฅเซ€ เชคเชฎเซ‡ เชกเซ‡เชŸเชพ เชธเซ‡เชŸเชฎเชพเช‚เชฅเซ€ เชฐเซ‡เช•เซ‹เชฐเซเชกเชจเชพ เช•เซ‹เชˆเชชเชฃ เชฌเซ‡เชš เช…เชฅเชตเชพ เช•เซ‹เชˆเชชเชฃ เช•เซ‰เชฒเชฎเชจเซ‡ เช…เชคเซเชฏเช‚เชค เชธเชธเซเชคเชพเชฎเชพเช‚ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚, เช…เชฎเซ‡ เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชฎเซ‹เช•เชฒเซ€เช เช›เซ€เช: เชเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพ, เช…เชจเซ‡ เชชเช›เซ€ เชฐเซ‡เช•เซ‹เชฐเซเชกเชจเซ€ เชเช• เช…เชฅเชตเชพ เชตเชงเซ เชฌเซ‡เชš.

เชตเชฟเชตเชฟเชง เชซเซ‹เชฐเซเชฎเซ‡เชŸเซเชธ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเชพ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

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 GB เชกเซ‡เชŸเชพ เชฒเช–เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช, เชœเซ‡เชฎเชพเช‚ 1024 MB เชฆเชฐเซ‡เช• เชนเชฟเชธเซเชธเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ 1 เช•เซ‰เชฒเชฎ เชธเชพเชฅเซ‡ เชชเซเชฐเชฅเชฎ 16 MB เชกเซ‡เชŸเชพ เชซเซเชฐเซ‡เชฎ เชฌเชจเชพเชตเซ€เช:

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 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 1MB เชนเชฟเชธเซเชธเชพเชฎเชพเช‚เชฅเซ€ 1024GB เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชธเชฐเช•เชพเชฐเช• เชฅเซเชฐเซเชชเซเชŸ 1 GB/s เช›เซ‡. เชœเซ‹ เช†เชชเชฃเซ‡ เชฎเซ‹เชŸเชพ เช…เชฅเชตเชพ เชจเชพเชจเชพ เชญเชพเช—เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เชคเซ‹ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡? เช† เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช›เซ‡:

Apache Arrow เชตเชกเซ‡ เช•เซ‰เชฒเชฎ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช—

เช•เชพเชฎเช—เซ€เชฐเซ€ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ 256K เชฅเซ€ 64K เชนเชฟเชธเซเชธเชพเชฎเชพเช‚ เช˜เชŸเซ€ เช›เซ‡. เชฎเชจเซ‡ เช†เชถเซเชšเชฐเซเชฏ เชฅเชฏเซเช‚ เช•เซ‡ 1 MB เชนเชฟเชธเซเชธเชพ เชชเชฐ 16 MB เชนเชฟเชธเซเชธเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชเชกเชชเชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เชตเชงเซ เชŠเช‚เชกเชพเชฃเชชเซ‚เชฐเซเชตเช• เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเชฎเชœเชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชถเซเช‚ เช† เชเช• เชธเชพเชฎเชพเชจเซเชฏ เชตเชฟเชคเชฐเชฃ เช›เซ‡ เช•เซ‡ เชชเช›เซ€ เช•เช‚เชˆเช• เชฌเซ€เชœเซเช‚ เช›เซ‡.

เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚, เชกเซ‡เชŸเชพ เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡ เชธเช‚เช•เซเชšเชฟเชค เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช•เชฆ เช…เชจเซ‡ "เชตเชพเชฏเชฐเซ‹เชฎเชพเช‚" เชฒเช—เชญเช— เชธเชฎเชพเชจ เช›เซ‡. เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚, เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชเช• เชตเชงเชพเชฐเชพเชจเซ‹ เชตเชฟเช•เชฒเซเชช เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡.

เชชเชฐเชฟเชฃเชพเชฎ

เช•เซ‹เชฒเชฎเชฐ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เช เชฎเซ‹เชŸเชพ เชกเซ‡เชŸเชพ เชธเซ‡เชŸเซเชธเชจเซ‡ เช•เซ‹เชฒเชฎเชฐ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ เชŸเซ‚เชฒเซเชธเชฎเชพเช‚ เชซเซ€เชก เช•เชฐเชตเชพเชจเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชค เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เชœเซ‡เชฎ เช•เซ‡ เชจเชพเชจเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชชเชพเช‚เชกเชพ. เชกเซ‡เชŸเชพ เชธเซ‡เชตเชพเช“ เช•เซ‡ เชœเซ‡ เชชเช‚เช•เซเชคเชฟ-เช“เชฐเชฟเชเชจเซเชŸเซ‡เชก เชธเซเชŸเซ‹เชฐเซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเชจเชพ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹