我正在测试MonetDB作为数据科学项目的解决方案。我有一张21K列的表格-除了三列以外,所有功能都被描述为float(32位)和6.5M行(可能会变大也可能不会变大,也许多达2000万行)。
我的目标是使用MonetDB上的集成Python来进行训练,而不必每次都从DB导出数据。另外,对特定列的查询是必需的,因此列存储可以是一个显着的优势。 我已经编译了MonetDB 11.31.13以获得嵌入式Python支持。操作系统是CentOS7。存储不是SSD。具有约300GB内存的48核服务器。我在表上创建了一个(唯一的)索引(不进行分析)。
我注意到,当我
SELECT * FROM [TABLE_NAME] SAMPLE 50;
需要很长时间才能完成。
然后,我尝试了:
SELECT f1, f2, ..., f501 from [TABLE_NAME] SAMPLE 50;
SELECT f1, f2, ..., f1001 from [TABLE_NAME] SAMPLE 50;
SELECT f1, f2, ..., f2001 from [TABLE_NAME] SAMPLE 50;
...
SELECT * from [TABLE_NAME] SAMPLE 50;
我使用mclient在本地运行查询,并用时间来衡量所花费的时间,我注意到了两件事:
在一段时间内,单个内核占用100%的CPU。列越多,完成时间就越长。只有完成后,我才能看到所有内核都在工作,正在消耗数据等。此外,在此期间,查询不会出现在
select * from sys.queue();
最终,从表中获取50行所需的时间将近4个小时。
列数增加了一倍,但在测试的每个步骤之间,获得结果所需的时间却增加了三倍。
所以我的问题是: 这种行为是预期的还是反映出我做错了什么?
从表中请求的数据应为4MB(50 * 21000 * 4字节)左右,因此这反映了等待如此少量数据的大量时间。
感谢您的帮助!