เจ…เจชเจพเจšเฉ‡ เจเจฐเฉ‹ เจจเจพเจฒ เจ•เจพเจฒเจฎ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจเจพ

เจฒเฉ‡เจ– เจฆเจพ เจ…เจจเฉเจตเจพเจฆ เจ•เฉ‹เจฐเจธ เจฆเฉ‡ เจตเจฟเจฆเจฟเจ†เจฐเจฅเฉ€เจ†เจ‚ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจกเจพเจŸเจพ เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐ.

เจ…เจชเจพเจšเฉ‡ เจเจฐเฉ‹ เจจเจพเจฒ เจ•เจพเจฒเจฎ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจเจพ

เจชเจฟเจ›เจฒเฉ‡ เจ•เฉเจ เจนเจซเจผเจคเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเฉˆ เจจเฉ‹เจ‚เจ— เจฒเฉ€ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจ…เจชเจพเจšเฉ‡ เจคเฉ€เจฐ เจฌเจพเจˆเจจเจฐเฉ€ เจธเจŸเฉเจฐเฉ€เจฎเจฟเฉฐเจ— เจซเจพเจฐเจฎเฉˆเจŸ, เจฎเฉŒเจœเฉ‚เจฆเจพ เจฌเฉ‡เจคเจฐเจคเฉ€เจฌเฉ‡ เจชเจนเฉเฉฐเจš/IPC เจซเจพเจˆเจฒ เจซเจพเจฐเจฎเฉˆเจŸ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจ• เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ Java เจ…เจคเฉ‡ C++ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเจพเจˆเจฅเจจ เจฌเจพเจˆเจกเจฟเฉฐเจ— เจนเจจเฅค เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจฆเฉฑเจธเจพเจ‚เจ—เจพ เจ•เจฟ เจซเจพเจฐเจฎเฉˆเจŸ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เจพ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเจพเจ‚เจกเจพ เจกเฉ‡เจŸเจพเจซเฉเจฐเฉ‡เจฎ เจฒเจˆ เจฌเจนเฉเจค เจ‰เฉฑเจš เจกเฉ‡เจŸเจพ เจฅเฉเจฐเจฐเฉ‚เจชเฉเจŸ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจธเจŸเฉเจฐเฉ€เจฎเจฟเฉฐเจ— เจ•เจพเจฒเจฎ เจกเฉ‡เจŸเจพ

เจ‡เฉฑเจ• เจ†เจฎ เจธเจตเจพเจฒ เจœเฉ‹ เจฎเฉˆเจ‚ เจคเฉ€เจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจ‡เฉฑเจ• เจ•เจคเจพเจฐ- เจœเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจก-เจ…เจงเจพเจฐเจฟเจค เจซเจพเจฐเจฎเฉˆเจŸ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ-เจ…เจงเจพเจฐเจฟเจค เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจธเจพเจฐเจฃเฉ€เจฌเฉฑเจง เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจตเฉฑเจกเฉ‡ เจธเฉˆเฉฑเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจพเจˆเจ—เจฐเฉ‡เจŸ เจ•เจฐเจจ เจฆเฉ€ เจ‰เฉฑเจš เจ•เฉ€เจฎเจค เจนเฉˆเฅค เจฎเจฒเจŸเฉ€-เจ—เฉ€เจ—เจพเจฌเจพเจˆเจŸ เจกเฉ‡เจŸเจพเจธเฉˆเจŸเจพเจ‚ เจฒเจˆ, เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจœเจพเจ‚ เจกเจฟเจธเจ• เจ‰เฉฑเจคเฉ‡ เจŸเฉเจฐเจพเจ‚เจธเจชเฉ‹เจœเจผ เจ•เจฐเจจเจพ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจตเฉฑเจกเจพ เจ•เฉฐเจฎ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจ เจฒเจˆ, เจญเจพเจตเฉ‡เจ‚ เจธเจฐเฉ‹เจค เจกเฉ‡เจŸเจพ เจ•เจคเจพเจฐ เจœเจพเจ‚ เจ•เจพเจฒเจฎ เจนเฉ‹เจตเฉ‡, เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจ•เจคเจพเจฐเจพเจ‚ เจฆเฉ‡ เจ›เฉ‹เจŸเฉ‡ เจฌเฉˆเจšเจพเจ‚ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃเจพ เจนเฉˆ, เจนเจฐเฉ‡เจ• เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจพเจฒเจฎ เจฒเฉ‡เจ†เจ‰เจŸ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค

เจ…เจชเจพเจšเฉ‡ เจเจฐเฉ‹ เจตเจฟเฉฑเจš, เจŸเฉ‡เจฌเจฒ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจฃ เจตเจพเจฒเฉ‡ เจ‡เจจ-เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ•เจพเจฒเจฎ เจเจฐเฉ‡ เจฆเฉ‡ เจธเฉฐเจ—เฉเจฐเจนเจฟ เจจเฉ‚เฉฐ เจฐเจฟเจ•เจพเจฐเจก เจฌเฉˆเจš เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจฒเจพเจœเจผเฉ€เจ•เจฒ เจŸเฉ‡เจฌเจฒ เจฆเฉ‡ เจ‡เฉฑเจ•เจฒเฉ‡ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจฃ เจฒเจˆ, เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ‡ เจ•เจˆ เจฌเฉˆเจš เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉ€เจคเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจฎเฉŒเจœเฉ‚เจฆเจพ "เจฐเฉˆเจ‚เจกเจฎ เจเจ•เจธเฉˆเจธ" เจซเจพเจˆเจฒ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจซเจพเจˆเจฒ เจฆเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจŸเฉ‡เจฌเจฒ เจธเจ•เฉ€เจฎเจพ เจ…เจคเฉ‡ เจฌเจฒเจพเจ• เจธเจฅเจพเจจเจพเจ‚ เจตเจพเจฒเฉ‡ เจฎเฉˆเจŸเจพเจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจฐเจฟเจ•เจพเจฐเจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจœเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจฌเจนเฉเจค เจธเจธเจคเฉ‡ เจขเฉฐเจ— เจจเจพเจฒ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฌเฉˆเจš เจœเจพเจ‚ เจกเฉ‡เจŸเจพ เจธเฉˆเฉฑเจŸ เจคเฉ‹เจ‚ เจ•เฉ‹เจˆ เจ•เจพเจฒเจฎ เจšเฉเจฃ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจธเจŸเฉเจฐเฉ€เจฎเจฟเฉฐเจ— เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจธเฉเจจเฉ‡เจนเจฟเจ†เจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจญเฉ‡เจœเจฆเฉ‡ เจนเจพเจ‚: เจ‡เฉฑเจ• เจฐเฉ‚เจชเจฐเฉ‡เจ–เจพ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจœเจพเจ‚ เจตเฉฑเจง เจฌเฉˆเจšเฅค

เจตเฉฑเจ–-เจตเฉฑเจ– เจซเจพเจฐเจฎเฉˆเจŸ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ:

เจ…เจชเจพเจšเฉ‡ เจเจฐเฉ‹ เจจเจพเจฒ เจ•เจพเจฒเจฎ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจเจพ

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

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจกเฉ‡เจŸเจพ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจนเฉˆ, เจเจฐเฉ‹ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ‡ เจฌเฉˆเจšเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจพ เจ‡เฉฑเจ• เจœเจผเฉ€เจฐเฉ‹-เจ•เจพเจชเฉ€ เจ•เจพเจฐเจตเจพเจˆ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจธเจŸเฉเจฐเฉ€เจฎ เจฐเฉ€เจกเจฐ เจ–เฉ‹เจฒเฉเจนเจฆเจพ เจนเจพเจ‚, เจกเจพเจŸเจพ เจชเฉœเฉเจนเจฆเจพ เจนเจพเจ‚ 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 เจนเฉˆเฅค เจ•เฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจตเฉฑเจกเฉ‡ เจœเจพเจ‚ เจ›เฉ‹เจŸเฉ‡ เจŸเฉเจ•เฉœเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚? เจ‡เจน เจจเจคเฉ€เจœเฉ‡ เจนเจจ:

เจ…เจชเจพเจšเฉ‡ เจเจฐเฉ‹ เจจเจพเจฒ เจ•เจพเจฒเจฎ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจเจพ

เจชเฉเจฐเจฆเจฐเจธเจผเจจ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹