本节在数据量比较大的情况下,对比esproc和python。
数据量:7000多条万记录,5个字段分别是orderid,clientid,sellerid,amount,date。总大小超过3G。
1. 筛选8月份的交易记录
esproc
A | |
1 | =now() |
2 | =file("E:\\orders_big_data\\orders.csv").cursor@tc() |
3 | =A2.select(month(date)==8).fetch() |
4 | =interval@ms(A1,now()) |
A2:f.cursor()
根据文件f创建游标并返回,数据扫描完将自动关闭游标。@t, f中第一行记录作为字段名,不使用本选项时默认使用_1,_2,…作为字段名. @c, 无s时用逗号分隔。如果同时有s则用s分隔。
A3:筛选出8月份的订单记录并取出结果
esproc并行代码:
A | |
1 | =now() |
2 | =file("E:\\orders_big_data\\orders.csv").cursor@tmc(;16) |
3 | =A2.select(month(date)==8).fetch() |
4 | =interval@ms(A1,now()) |
A2:cursor@m(;n),@m选项,返回成多路游标,n表示路数。这时结果可能改变原来数据的顺序(筛选数据大多数情况下也不需要保持原序)。
python:
import time
import pandas as pd
import numpy as np
s = time.time()
chunksize=1000000
order_data = pd.read_csv('E:\\orders_big_data\\orders.csv',iterator=True,chunksize=chunksize)
i = 0
month_8_list = []
for chunk in order_data:
chunk['date'] = pd.to_datetime(chunk['date'])
chunk_month_8 = chunk[chunk['date'].dt.month==8]
month_8_list.append(chunk_month_8)
month_8 = pd.concat(month_8_list,ignore_index=True)
print(month_8)
e = time.time()
print(e-s)
定义chunksize大小为1000000万条记录。
pd.read_csv(fileorbuf,iterator,chunksize) iterator,返回一个TextFileReader 对象,以便逐块处理文件,chunksize文件块大小。
循环读取文件,每次都取chunksize的大小,筛选出8月份的记录,放入初始化的list中。
合并list中的dataframe得到结果。
pandas本身不支持并行,所以这里没有python的并行测试。
结果:
esproc单线程
esproc并行:
python