แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜ Apache Arrow-แƒ˜แƒ—

แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜ แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ“แƒ แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ แƒแƒ“ แƒ™แƒฃแƒ แƒกแƒ˜แƒก แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ˜แƒœแƒŸแƒ˜แƒœแƒ”แƒ แƒ˜.

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜ Apache Arrow-แƒ˜แƒ—

แƒ‘แƒแƒšแƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ™แƒ•แƒ˜แƒ แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒœแƒแƒœแƒ’ แƒšแƒ˜ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ แƒแƒžแƒแƒฉแƒ˜แƒก แƒ˜แƒกแƒแƒ แƒ˜ แƒแƒ แƒแƒ‘แƒ˜แƒ—แƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ•แƒกแƒ”แƒ‘แƒก แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ—แƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก/IPC แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒก. แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก Java แƒ“แƒ C++ แƒ˜แƒ›แƒžแƒšแƒ”แƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒจแƒ”แƒ™แƒ•แƒ แƒ. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ›แƒ” แƒแƒ’แƒ˜แƒฎแƒกแƒœแƒ˜แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒ“แƒ แƒ’แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒฆแƒแƒš แƒ’แƒแƒ›แƒขแƒแƒ แƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒแƒ‘แƒแƒก แƒžแƒแƒœแƒ“แƒแƒก DataFrame-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜

Arrow-แƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ—แƒแƒ’แƒแƒœ แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒแƒ แƒ˜แƒก แƒ“แƒ˜แƒ“แƒ˜ แƒขแƒแƒ‘แƒฃแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ’แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ–แƒ” แƒแƒœ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ–แƒ” แƒแƒ แƒ˜แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒ“แƒแƒœ แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜. แƒ›แƒ แƒแƒ•แƒแƒš แƒ’แƒ˜แƒ’แƒแƒ‘แƒแƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒจแƒ˜ แƒแƒœ แƒ“แƒ˜แƒกแƒ™แƒ–แƒ” แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒญแƒแƒ แƒ‘แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒแƒก.

แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ”แƒก แƒฌแƒงแƒแƒ แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ˜ แƒ—แƒฃ แƒกแƒ•แƒ”แƒขแƒ˜, แƒ”แƒ แƒ—แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜แƒ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ˜แƒ แƒ” แƒžแƒแƒ แƒขแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒแƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ—.

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 แƒ’แƒ‘ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ 1 แƒ›แƒ‘ แƒชแƒแƒšแƒ˜ แƒ—แƒ˜แƒ—แƒ, แƒกแƒฃแƒš 1024 แƒชแƒแƒšแƒ˜. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ 1MB แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒฉแƒแƒ แƒฉแƒ 16 แƒกแƒ•แƒ”แƒขแƒ˜แƒ—:

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 แƒœแƒแƒฌแƒ˜แƒšแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒจแƒ”แƒแƒ“แƒ’แƒ”แƒœแƒก 1 GB แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒก:

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

แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ’แƒ˜แƒฉแƒœแƒ“แƒ”แƒ— แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜. แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ”แƒก? แƒ แƒแƒ’แƒแƒ  แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก แƒœแƒแƒญแƒ แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒžแƒแƒœแƒ“แƒ”แƒ‘แƒ˜แƒก DataFrame-แƒ˜แƒก แƒ›แƒแƒซแƒ˜แƒ”แƒ‘แƒแƒ–แƒ”?

แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ

แƒ แƒแƒ’แƒแƒ แƒช แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒก แƒ–แƒแƒ›แƒ แƒ›แƒชแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ, แƒžแƒแƒœแƒ“แƒแƒ”แƒ‘แƒจแƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ” แƒกแƒ•แƒ”แƒขแƒแƒ•แƒแƒœแƒ˜ DataFrame-แƒ˜แƒก แƒ แƒ”แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ แƒฅแƒ”แƒจแƒ˜แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒกแƒฅแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ. แƒแƒกแƒ”แƒ•แƒ” แƒแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒฎแƒแƒ แƒฏแƒ”แƒ‘แƒ˜ C++ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒ›แƒแƒกแƒ˜แƒ•แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒ›แƒแƒ— แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒฃแƒคแƒ”แƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ’แƒแƒœ.

1 แƒ›แƒ‘-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒ”แƒ›แƒแƒ—, แƒฉแƒ”แƒ›แƒก แƒšแƒ”แƒžแƒขแƒแƒžแƒ–แƒ” (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 แƒ’แƒ‘/แƒฌแƒ› 1 GB DataFrame-แƒ˜แƒก แƒแƒฆแƒกแƒแƒ“แƒ’แƒ”แƒœแƒแƒ“ 1024 1 MB แƒ‘แƒšแƒแƒ™แƒ˜แƒ“แƒแƒœ. แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒฃแƒคแƒ แƒ แƒ“แƒ˜แƒ“ แƒแƒœ แƒžแƒแƒขแƒแƒ แƒ แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก? แƒแƒฅ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ—:

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜ Apache Arrow-แƒ˜แƒ—

แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ˜แƒ™แƒšแƒ”แƒ‘แƒก 256K-แƒ“แƒแƒœ 64K แƒœแƒแƒฌแƒ˜แƒšแƒแƒ›แƒ“แƒ”. แƒ’แƒแƒ›แƒ˜แƒ™แƒ•แƒ˜แƒ แƒ“แƒ, แƒ แƒแƒ› 1 แƒ›แƒ‘ แƒœแƒแƒฌแƒ˜แƒšแƒแƒ™แƒ”แƒ‘แƒ˜ แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒ‘แƒแƒ“แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” 16 แƒ›แƒ‘. แƒฆแƒ˜แƒ แƒก แƒฃแƒคแƒ แƒ แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ˜แƒแƒœแƒ˜ แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ แƒ“แƒ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒ, แƒแƒ แƒ˜แƒก แƒ—แƒฃ แƒแƒ แƒ แƒ”แƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ แƒ—แƒฃ แƒกแƒฎแƒ•แƒ แƒ แƒแƒ› แƒแƒ แƒ˜แƒก แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜.

แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒฃแƒšแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ–แƒแƒ›แƒ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒจแƒ˜ แƒ“แƒ "แƒ›แƒแƒ•แƒ—แƒฃแƒšแƒ–แƒ”" แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒ. แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒ•แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜.

แƒกแƒฃแƒš

แƒกแƒ•แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒ›แƒ˜แƒœแƒ’แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ’แƒ–แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒขแƒแƒœแƒแƒ“ แƒกแƒ•แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒžแƒแƒœแƒ“แƒ”แƒ‘แƒ˜ แƒ›แƒชแƒ˜แƒ แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒœ แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ–แƒ” แƒแƒ แƒ˜แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒก, แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒแƒœ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒแƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒชแƒ˜แƒ แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ แƒแƒช แƒฃแƒคแƒ แƒ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒแƒ แƒ˜แƒก 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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ