เด…เดชเตเดชเดพเดšเตเดšเต† เด†เดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดณเด‚ เดกเดพเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เด•เต‹เดดเตโ€Œเดธเดฟเดฒเต† เดตเดฟเดฆเตเดฏเดพเตผเดคเตเดฅเดฟเด•เตพเด•เตเด•เดพเดฏเดฟ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เดฟเดฏเดคเดพเดฃเต "เดกเดพเดฑเตเดฑ เดŽเดžเตเดšเดฟเดจเต€เดฏเตผ".

เด…เดชเตเดชเดพเดšเตเดšเต† เด†เดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดณเด‚ เดกเดพเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด•เดดเดฟเดžเตเดž เด•เตเดฑเดšเตเดšเต เด†เดดเตโ€Œเดšเด•เดณเดพเดฏเดฟ เดžเด™เตเด™เตพเด•เตเด•เตเดฃเตเดŸเต เดจเต‹เด™เต เดฒเดฟ เดšเต‡เตผเดคเตเดคเต เด…เดชเตเดชเดพเดšเตเดšเต† เด…เดฎเตเดชเดŸเดฏเดพเดณเด‚ เดฌเตˆเดจเดฑเดฟ เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดซเต‹เตผเดฎเดพเดฑเตเดฑเต, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฑเดพเตปเดกเด‚ เด†เด•เตเดธเดธเต/IPC เดซเดฏเตฝ เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เตพเด•เตเด•เต Java, C++ เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เดชเตˆเดคเตเดคเตบ เดฌเตˆเตปเดกเดฟเด‚เด—เตเด•เดณเตเด‚ เด‰เดฃเตเดŸเต. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดžเดพเตป เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด’เดฐเต เดชเดพเดฃเตเดŸเดธเต เดกเดพเดฑเตเดฑเดพเดซเตเดฐเต†เดฏเดฟเดฎเดฟเดจเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเด™เตเด™เดจเต† เด‰เดฏเตผเดจเตเดจ เดกเดพเดฑเตเดฑ เดคเตเดฐเต‚เดชเตเดŸเตเดŸเต เดจเต‡เดŸเดพเดฎเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เด•เต‹เดณเด‚ เดกเดพเดฑเตเดฑ

เด†เดฐเต‹ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดšเต‹เดฆเตเดฏเด‚, เด’เดฐเต เดตเดฐเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเต-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด•เต‹เดณเด‚-เด“เดฑเดฟเดฏเดจเตเดฑเดกเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดตเดฒเดฟเดฏ เดธเต†เดฑเตเดฑเต เดŸเดพเดฌเตเดฒเตผ เดกเดพเดฑเตเดฑ เดฎเตˆเด—เตเดฐเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‰เดฏเตผเดจเตเดจ เดตเดฟเดฒเดฏเดพเดฃเต. เดฎเตพเดŸเตเดŸเดฟ-เดœเดฟเด—เดพเดฌเตˆเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดธเต†เดฑเตเดฑเตเด•เตพเด•เตเด•เต, เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต‹ เดกเดฟเดธเตเด•เดฟเดฒเต‹ เดŸเตเดฐเดพเตปเดธเตเดชเต‹เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด’เดฐเต เดตเดฒเดฟเดฏ เดœเต‹เดฒเดฟเดฏเดพเดฃเต.

เดกเดพเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เด‰เดฑเดตเดฟเดŸ เดกเดพเดฑเตเดฑ เดตเดฐเดฟเดฏเต‹ เดจเดฟเดฐเดฏเต‹ เด†เดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เด’เดฐเต เด“เดชเตโ€Œเดทเตป, เดตเดฐเดฟเด•เดณเตเดŸเต† เดšเต†เดฑเดฟเดฏ เดฌเดพเดšเตเดšเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต, เด“เดฐเต‹เดจเตเดจเดฟเดจเตเด‚ เด‰เดณเตเดณเดฟเตฝ เด’เดฐเต เด•เต‹เดณเด‚ เดฒเต‡เด”เดŸเตเดŸเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดชเตเดชเดพเดšเตเดšเต† เด†เดฐเต‹เดฏเดฟเตฝ, เด’เดฐเต เดŸเต‡เดฌเดฟเตพ เดšเด™เตเด•เดฟเดจเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด‡เตป-เดฎเต†เดฎเตเดฎเดฑเดฟ เด•เต‹เดณเด‚ เด…เดฑเต‡เด•เดณเตเดŸเต† เดถเต‡เด–เดฐเดคเตเดคเต† เดฑเต†เด•เตเด•เต‹เตผเดกเต เดฌเดพเดšเตเดšเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดฒเต‹เดœเดฟเด•เตเด•เตฝ เดŸเต‡เดฌเดฟเดณเดฟเดจเตเดฑเต† เด’เดฐเตŠเดฑเตเดฑ เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเดฏเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดฐเดตเดงเดฟ เดฌเดพเดšเตเดšเตเด•เดณเตเดŸเต† เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ "เดฑเดพเตปเดกเด‚ เด†เด•เตโ€Œเดธเดธเต" เดซเดฏเตฝ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ, เดŸเต‡เดฌเดฟเตพ เดธเตโ€Œเด•เต€เดฎเดฏเตเด‚ เดซเดฏเดฒเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเด‚ เดฌเตเดฒเต‹เด•เตเด•เต เดฒเต‡เด”เดŸเตเดŸเตเด‚ เด…เดŸเด™เตเด™เตเดจเตเดจ เดฎเต†เดฑเตเดฑเดพเดกเดพเดฑเตเดฑ เดžเด™เตเด™เตพ เดฑเต†เด•เตเด•เต‹เตผเดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด’เดฐเต เดกเดพเดฑเตเดฑเดพ เดธเต†เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดคเต เดฌเดพเดšเตเดšเต เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเต‹ เด•เต‹เดณเดฎเต‹ เดตเดณเดฐเต† เด•เตเดฑเดžเตเดž เดตเดฟเดฒเดฏเตเด•เตเด•เต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ, เดžเด™เตเด™เตพ เดธเดจเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดชเดฐเดฎเตเดชเดฐ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต: เด’เดฐเต เด”เดŸเตเดŸเตโ€Œเดฒเตˆเตป, เดคเตเดŸเตผเดจเตเดจเต เด’เดจเตเดจเต‹ เด…เดคเดฟเดฒเดงเดฟเด•เดฎเต‹ เดฌเดพเดšเตเดšเตเด•เดณเตเดŸเต† เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ.

เดตเตเดฏเดคเตเดฏเดธเตเดค เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เตพ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

เด…เดชเตเดชเดพเดšเตเดšเต† เด†เดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดณเด‚ เดกเดพเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดชเตˆเด†เดฐเต‹เดฏเดฟเดฒเต† เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดกเดพเดฑเตเดฑ: เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป

เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเดฟเด™เตเด™เดณเต† เด•เดพเดฃเดฟเด•เตเด•เดพเตป, เด’เดฐเตŠเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเด™เตเด•เดฟเดจเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃ เดกเดพเดฑเตเดฑเดพเดธเต†เดฑเตเดฑเต เดžเดพเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚:

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 เดšเด™เตเด•เตเด•เตพ เด…เดŸเด™เตเด™เตเดจเตเดจเต. เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, 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

เดˆ เดกเดพเดฑเตเดฑ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเตเดณเตเดณเดคเดฟเดจเดพเตฝ, เด†เดฐเต‹ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเตเดŸเต† เดฌเดพเดšเตเดšเตเด•เตพ เดฑเต€เดกเดฟเด‚เด—เต เดธเต€เดฑเต‹-เด•เต‹เดชเตเดชเดฟ เด“เดชเตเดชเดฑเต‡เดทเดจเดพเดฃเต. เดžเดพเตป เดธเตเดŸเตเดฐเต€เด‚ เดฑเต€เดกเตผ เดคเตเดฑเด•เตเด•เตเดจเตเดจเต, เดกเดพเดฑเตเดฑ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต 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-เดจเต, เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดžเดคเตเดชเต‹เดฒเต†, เดŽเดจเตเดฑเต† เดฒเดพเดชเตโ€ŒเดŸเต‹เดชเตเดชเดฟเตฝ (Quad-core 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 เด†เดฃเต†เดจเตเดจเต เด‡เดคเต เดฎเดพเดฑเตเดจเตเดจเต. เดจเดฎเตเดฎเตพ เดตเดฒเตเดคเต‹ เดšเต†เดฑเตเดคเต‹ เด†เดฏ เด•เดทเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเตฝ เดŽเดจเตเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเด‚? เด‡เดตเดฏเดพเดฃเต เดซเดฒเด™เตเด™เตพ:

เด…เดชเตเดชเดพเดšเตเดšเต† เด†เดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดณเด‚ เดกเดพเดฑเตเดฑ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดชเตเดฐเด•เดŸเดจเด‚ 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•