2019 年 9 月 11 日更新
注意更新版本
WITH
rand()/4294967295*100 AS s,
60 AS t1,
50 AS t10,
30 AS t20,
20 AS t2,
if(s < t10, 0, if(s > t1, 1, NULL)) as signal1,
if(s > t20, 0, if(s < t2, 1, NULL)) as signal2
SELECT
arrayFill(x -> (x != -2), groupArray(toInt8(ifNull(signal1 - signal2, -2)))) as k
FROM numbers_mt(10000000);
根据 Summer.H 的反馈进行了更新。在我的系统(Core i7-7820X)上,每个时间最好运行 5 次。两者之间的时间差异非常小。
1000 万个信号
随机生成+计算
- 1 个线程 - DolphinDB 337 毫秒,ClickHouse 291 毫秒
- 2 个线程(1 个核心)- DolphinDB 226 毫秒,ClickHouse 189 毫秒
仅计算
- 1 个线程 - DolphinDB 302 毫秒,ClickHouse 233 毫秒
- 2 个线程(1 个核心)- DolphinDB 179 毫秒,ClickHouse 165 毫秒
2.5 亿信号
随机生成+计算
- 1 个线程 - DolphinDB 7.901s、ClickHouse 7.103s
- 2 个线程(1 个核心)- DolphinDB 4.786s、ClickHouse 4.297s
- 4 线程(2 核)- ClickHouse 2.965s
仅计算
- 1 个线程 - DolphinDB 7.106s、ClickHouse 5.564s
- 2 个线程(1 个核心)- DolphinDB 3.966s、ClickHouse 3.668s
- 4 线程(2 核)- ClickHouse 2.573s
原创
请注意,这并不能回答与 DolphinDB 相关的具体问题 - 但这里也有一个使用 ClickHouse 的版本。
WITH
60 AS t1,
50 AS t10,
30 AS t20,
20 AS t2,
([if(s < t10, 0, NULL), if(s > t20, 0, NULL)], [if(s > t1, 1, NULL), if(s < t2, 1, NULL)]) AS signal
SELECT arrayFill(x -> (x != -2), groupArray(ifNull(coalesce((signal.1)[1], (signal.2)[1]) - coalesce((signal.1)[2], (signal.2)[2]), -2))) AS k
FROM
(
SELECT arrayJoin([10, 20, 70, 59, 42, 49, 19, 25, 26, 35]) AS s
)
FORMAT TSV
[-1,-1,1,1,0,0,-1,-1,-1,0]
对 1000 万个随机样本进行基准测试。 Summer.H 在我的系统上最快的 DolphinDB 答案,最好用完 5 个:
DolphinDB (4 threads)
./dolphindb
DolphinDB Systems 0.99.0 64 bit Copyright (c) 2011~2019 DolphinDB, Inc. Licensed to Trial User. Expires on 2019.12.31 (Build:2019.10.25)
>timer t1= 60
timer t10 = 50
timer t20 = 30
timer t2 = 20
timer signal = rand(100.0, 10000000)
timer direction = (iif(signal >t1, 1h, iif(signal < t10, 0h, 00h)) - iif(signal <t2, 1h, iif(signal > t20, 0h, 00h))).ffill().nullFill(0h)
;>>>>>>
Time elapsed: 0.01 ms
Time elapsed: 0.001 ms
Time elapsed: 0.001 ms
Time elapsed: 0.001 ms
Time elapsed: 72.675 ms
Time elapsed: 305.442 ms
Total time: 378 ms
ClickHouse(限制 4 个线程,如 DolphinDB),最好用完 5 个:
CREATE TEMPORARY TABLE dtest2 AS
WITH
rand()%100 + rand()/4294967295 AS s,
60 AS t1,
50 AS t10,
30 AS t20,
20 AS t2,
([if(s < t10, 0, NULL), if(s > t20, 0, NULL)], [if(s > t1, 1, NULL), if(s < t2, 1, NULL)]) AS signal
SELECT arrayFill(x -> (x != -2), groupArray(ifNull(coalesce((signal.1)[1], (signal.2)[1]) - coalesce((signal.1)[2], (signal.2)[2]), -2))) AS k
FROM numbers_mt(10000000)
Ok.
0 rows in set. Elapsed: 0.300 sec. Processed 10.00 million rows, 80.00 MB (33.37 million rows/s., 266.94 MB/s.)
Total time 300 ms
ClickHouse,默认配置/无线程限制,最好用完5个:
CREATE TEMPORARY TABLE dtest2 AS
WITH
rand()%100 + rand()/4294967295 AS s,
60 AS t1,
50 AS t10,
30 AS t20,
20 AS t2,
([if(s < t10, 0, NULL), if(s > t20, 0, NULL)], [if(s > t1, 1, NULL), if(s < t2, 1, NULL)]) AS signal
SELECT arrayFill(x -> (x != -2), groupArray(ifNull(coalesce((signal.1)[1], (signal.2)[1]) - coalesce((signal.1)[2], (signal.2)[2]), -2))) AS k
FROM numbers_mt(10000000)
Ok.
0 rows in set. Elapsed: 0.191 sec. Processed 10.00 million rows, 80.00 MB (52.22 million rows/s., 417.74 MB/s.)
每个人的最终时间:
kdb (800ms), DolphinDB (480ms, 378ms, 330ms?), ClickHouse (191ms)
我在这里进一步用 2.5 亿个随机信号进行了基准测试 - DolphinDB 耗时 9214.99 毫秒(1420 毫秒随机信号生成 + 7794.24 毫秒计算)。 ClickHouse 总共花费了 4272 毫秒用于随机生成和计算。
受到我的 DolphinDB 许可证的限制,但 ClickHouse 在 17.4 秒(内存表)或 20.1 秒(到磁盘)内管理了 10 亿个信号。