เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดดเตโเดธเดฟเดฒเต เดตเดฟเดฆเตเดฏเดพเตผเดคเตเดฅเดฟเดเตพเดเตเดเดพเดฏเดฟ เดชเตเดฐเดคเตเดฏเตเดเด เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเดฟเดฏเดคเดพเดฃเต
เดเดดเดฟเดเตเด เดเตเดฑเดเตเดเต เดเดดเตโเดเดเดณเดพเดฏเดฟ เดเดเตเดเตพเดเตเดเตเดฃเตเดเต
เดธเตเดเตเดฐเตเดฎเดฟเดเดเต เดเตเดณเด เดกเดพเดฑเตเดฑ
เดเดฐเต เดเดชเดฏเตเดเตเดคเดพเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดจเดฟเดเตเดเต เดฒเดญเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดธเดพเดงเดพเดฐเดฃ เดเตเดฆเตเดฏเด, เดเดฐเต เดตเดฐเดฟ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฑเตเดเตเดเตเตผเดกเต-เดเดฑเดฟเดฏเดจเตเดฑเดกเต เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดเตเดณเด-เดเดฑเดฟเดฏเดจเตเดฑเดกเต เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเดฒเตเดเตเดเต เดตเดฒเดฟเดฏ เดธเตเดฑเตเดฑเต เดเดพเดฌเตเดฒเตผ เดกเดพเดฑเตเดฑ เดฎเตเดเตเดฐเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฏเตผเดจเตเดจ เดตเดฟเดฒเดฏเดพเดฃเต. เดฎเตพเดเตเดเดฟ-เดเดฟเดเดพเดฌเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเตเดเตพเดเตเดเต, เดฎเตเดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต เดกเดฟเดธเตเดเดฟเดฒเต เดเตเดฐเดพเตปเดธเตเดชเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดเดฐเต เดตเดฒเดฟเดฏ เดเตเดฒเดฟเดฏเดพเดฃเต.
เดกเดพเดฑเตเดฑ เดธเตเดเตเดฐเตเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดเดฑเดตเดฟเด เดกเดพเดฑเตเดฑ เดตเดฐเดฟเดฏเต เดจเดฟเดฐเดฏเต เดเดฃเตเดเตเดเดฟเดฒเตเด, เดเดฐเต เดเดชเตโเดทเตป, เดตเดฐเดฟเดเดณเตเดเต เดเตเดฑเดฟเดฏ เดฌเดพเดเตเดเตเดเตพ เด เดฏเดฏเตเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต, เดเดฐเตเดจเตเดจเดฟเดจเตเด เดเดณเตเดณเดฟเตฝ เดเดฐเต เดเตเดณเด เดฒเตเดเดเตเดเต เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
เด เดชเตเดชเดพเดเตเดเต เดเดฐเตเดฏเดฟเตฝ, เดเดฐเต เดเตเดฌเดฟเตพ เดเดเตเดเดฟเดจเต เดชเตเดฐเดคเดฟเดจเดฟเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดเตป-เดฎเตเดฎเตเดฎเดฑเดฟ เดเตเดณเด เด เดฑเตเดเดณเตเดเต เดถเตเดเดฐเดคเตเดคเต เดฑเตเดเตเดเตเตผเดกเต เดฌเดพเดเตเดเต เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต. เดเดฐเต เดฒเตเดเดฟเดเตเดเตฝ เดเตเดฌเดฟเดณเดฟเดจเตเดฑเต เดเดฐเตเดฑเตเดฑ เดกเดพเดฑเตเดฑเดพ เดเดเดจเดฏเต เดชเตเดฐเดคเดฟเดจเดฟเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดฐเดตเดงเดฟ เดฌเดพเดเตเดเตเดเดณเตเดเต เดฑเตเดเตเดเตเตผเดกเตเดเตพ เดถเตเดเดฐเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด.
เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ "เดฑเดพเตปเดกเด เดเดเตโเดธเดธเต" เดซเดฏเตฝ เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตฝ, เดเตเดฌเดฟเตพ เดธเตโเดเตเดฎเดฏเตเด เดซเดฏเดฒเดฟเดจเตเดฑเต เด เดตเดธเดพเดจเด เดฌเตเดฒเตเดเตเดเต เดฒเตเดเดเตเดเตเด เด เดเดเตเดเตเดจเตเดจ เดฎเตเดฑเตเดฑเดพเดกเดพเดฑเตเดฑ เดเดเตเดเตพ เดฑเตเดเตเดเตเตผเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเดฐเต เดกเดพเดฑเตเดฑเดพ เดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดคเต เดฌเดพเดเตเดเต เดฑเตเดเตเดเตเตผเดกเตเดเดณเต เดเตเดณเดฎเต เดตเดณเดฐเต เดเตเดฑเดเตเด เดตเดฟเดฒเดฏเตเดเตเดเต เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. เดเดฐเต เดธเตเดเตเดฐเตเดฎเดฟเดเดเต เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตฝ, เดเดเตเดเตพ เดธเดจเตเดฆเตเดถเดเตเดเดณเตเดเต เดเดฐเต เดชเดฐเดฎเตเดชเดฐ เด เดฏเดฏเตโเดเตเดเตเดจเตเดจเต: เดเดฐเต เดเดเตเดเตโเดฒเตเตป, เดคเตเดเตผเดจเตเดจเต เดเดจเตเดจเต เด เดคเดฟเดฒเดงเดฟเดเดฎเต เดฌเดพเดเตเดเตเดเดณเตเดเต เดฑเตเดเตเดเตเตผเดกเตเดเตพ.
เดตเตเดฏเดคเตเดฏเดธเตเดค เดซเตเตผเดฎเดพเดฑเตเดฑเตเดเตพ เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต:
เดชเตเดเดฐเตเดฏเดฟเดฒเต เดธเตเดเตเดฐเตเดฎเดฟเดเดเต เดกเดพเดฑเตเดฑ: เดเดชเตเดฒเดฟเดเตเดเตเดทเตป
เดเดคเต เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดจเดฟเดเตเดเดณเต เดเดพเดฃเดฟเดเตเดเดพเตป, เดเดฐเตเดฑเตเดฑ เดธเตเดเตเดฐเตเด เดเดเตเดเดฟเดจเต เดชเตเดฐเดคเดฟเดจเดฟเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดเดฆเดพเดนเดฐเดฃ เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเต เดเดพเตป เดธเตเดทเตเดเดฟเดเตเดเตเด:
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