เจฒเฉเจ เจฆเจพ เจ
เจจเฉเจตเจพเจฆ เจเฉเจฐเจธ เจฆเฉ เจตเจฟเจฆเจฟเจเจฐเจฅเฉเจเจ เจฒเจ เจตเจฟเจธเจผเฉเจธเจผ เจคเฉเจฐ 'เจคเฉ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจธเฉ
เจชเจฟเจเจฒเฉ เจเฉเจ เจนเจซเจผเจคเจฟเจเจ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจเฉเจฒ เจนเฉ
เจธเจเฉเจฐเฉเจฎเจฟเฉฐเจ เจเจพเจฒเจฎ เจกเฉเจเจพ
เจเฉฑเจ เจเจฎ เจธเจตเจพเจฒ เจเฉ เจฎเฉเจ เจคเฉเจฐ เจเจชเจญเฉเจเจคเจพเจตเจพเจ เจคเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเจพ เจนเจพเจ, เจเฉฑเจ เจเจคเจพเจฐ- เจเจพเจ เจฐเจฟเจเจพเจฐเจก-เจ เจงเจพเจฐเจฟเจค เจซเจพเจฐเจฎเฉเจ เจคเฉเจ เจเฉฑเจ เจเจพเจฒเจฎ-เจ เจงเจพเจฐเจฟเจค เจซเจพเจฐเจฎเฉเจ เจตเจฟเฉฑเจ เจธเจพเจฐเจฃเฉเจฌเฉฑเจง เจกเฉเจเจพ เจฆเฉ เจตเฉฑเจกเฉ เจธเฉเฉฑเจเจพเจ เจจเฉเฉฐ เจฎเจพเจเจเจฐเฉเจ เจเจฐเจจ เจฆเฉ เจเฉฑเจ เจเฉเจฎเจค เจนเฉเฅค เจฎเจฒเจเฉ-เจเฉเจเจพเจฌเจพเจเจ เจกเฉเจเจพเจธเฉเจเจพเจ เจฒเจ, เจฎเฉเจฎเฉเจฐเฉ เจตเจฟเฉฑเจ เจเจพเจ เจกเจฟเจธเจ เจเฉฑเจคเฉ เจเฉเจฐเจพเจเจธเจชเฉเจเจผ เจเจฐเจจเจพ เจเฉฑเจ เจฌเจนเฉเจค เจตเฉฑเจกเจพ เจเฉฐเจฎ เจนเฉ เจธเจเจฆเจพ เจนเฉเฅค
เจกเฉเจเจพ เจจเฉเฉฐ เจธเจเฉเจฐเฉเจฎ เจเจฐเจจ เจฒเจ, เจญเจพเจตเฉเจ เจธเจฐเฉเจค เจกเฉเจเจพ เจเจคเจพเจฐ เจเจพเจ เจเจพเจฒเจฎ เจนเฉเจตเฉ, เจเฉฑเจ เจตเจฟเจเจฒเจช เจเจคเจพเจฐเจพเจ เจฆเฉ เจเฉเจเฉ เจฌเฉเจเจพเจ เจจเฉเฉฐ เจญเฉเจเจฃเจพ เจนเฉ, เจนเจฐเฉเจ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจพเจฒเจฎ เจฒเฉเจเจเจ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค
เจ เจชเจพเจเฉ เจเจฐเฉ เจตเจฟเฉฑเจ, เจเฉเจฌเจฒ เจฆเฉ เจนเจฟเฉฑเจธเฉ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจฃ เจตเจพเจฒเฉ เจเจจ-เจฎเฉเจฎเฉเจฐเฉ เจเจพเจฒเจฎ เจเจฐเฉ เจฆเฉ เจธเฉฐเจเฉเจฐเจนเจฟ เจจเฉเฉฐ เจฐเจฟเจเจพเจฐเจก เจฌเฉเจ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจเฉฑเจ เจฒเจพเจเจผเฉเจเจฒ เจเฉเจฌเจฒ เจฆเฉ เจเฉฑเจเจฒเฉ เจกเฉเจเจพ เจขเจพเจเจเฉ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจฃ เจฒเจ, เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจเจ เจฌเฉเจ เจเจเฉฑเจ เฉ เจเฉเจคเฉ เจเจพ เจธเจเจฆเฉ เจนเจจเฅค
เจฎเฉเจเฉเจฆเจพ "เจฐเฉเจเจกเจฎ เจเจเจธเฉเจธ" เจซเจพเจเจฒ เจซเจพเจฐเจฎเฉเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจซเจพเจเจฒ เจฆเฉ เจ เฉฐเจค เจตเจฟเฉฑเจ เจเฉเจฌเจฒ เจธเจเฉเจฎเจพ เจ เจคเฉ เจฌเจฒเจพเจ เจธเจฅเจพเจจเจพเจ เจตเจพเจฒเฉ เจฎเฉเจเจพเจกเฉเจเจพ เจจเฉเฉฐ เจฐเจฟเจเจพเจฐเจก เจเจฐเจฆเฉ เจนเจพเจ, เจเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉเจ เจฌเจนเฉเจค เจธเจธเจคเฉ เจขเฉฐเจ เจจเจพเจฒ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจเจฟเจธเฉ เจตเฉ เจฌเฉเจ เจเจพเจ เจกเฉเจเจพ เจธเฉเฉฑเจ เจคเฉเจ เจเฉเจ เจเจพเจฒเจฎ เจเฉเจฃ เจธเจเจฆเฉ เจนเฉเฅค เจธเจเฉเจฐเฉเจฎเจฟเฉฐเจ เจซเจพเจฐเจฎเฉเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจธเฉเจจเฉเจนเจฟเจเจ เจฆเฉ เจเฉฑเจ เจฒเฉเฉ เจญเฉเจเจฆเฉ เจนเจพเจ: เจเฉฑเจ เจฐเฉเจชเจฐเฉเจเจพ, เจ เจคเฉ เจซเจฟเจฐ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจเฉฑเจ เจเจพเจ เจตเฉฑเจง เจฌเฉเจเฅค
เจตเฉฑเจ-เจตเฉฑเจ เจซเจพเจฐเจฎเฉเจ เจเฉเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเฉ เจนเจจ:
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