首页 > 解决方案 > MonetDb 在具有 20K 列的大表上的性能

问题描述

我正在测试 MonetDB 作为数据科学项目的解决方案。我有一个 21K 列的表 - 除了三个之外,所有列都是描述为浮点(32 位)和 650 万行(可能会或可能不会变大,可能高达 20M 行)的功能。

我的目标是在 MonetDB 上使用集成的 Python 来实现训练的能力,而无需每次都从数据库中导出数据。此外,对特定列的查询是必要的,因此列存储可能是一个显着的优势。我已经编译了 MonetDB 11.31.13 以获得嵌入式 Python 支持。操作系统是 CentOS 7。存储不是 SSD。48 核服务器,内存约 300GB。我在表上创建了一个(唯一)索引(没有分析)。

我注意到当我

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 在本地运行查询并使用 time 来测量花费的时间,我注意到两件事:

  1. 有一段时间单核占用 100% CPU。列越多,完成所需的时间就越长。只有当它完成时,我才能看到所有核心都在工作,正在消耗数据等......另外,在那段时间里,查询没有出现在 select * from sys.queue(); 最终的结果中,从表中获取 50 行所需的时间几乎是 4小时。

  2. 列的数量增加了一倍,但在测试的每一步之间,获得结果所需的时间增加了三倍。

所以我的问题是:这种行为是预期的还是反映了我做错了什么?

从表中请求的数据应该在 4MB 左右(50 * 21000 * 4Bytes),因此这反映了等待如此少量数据的大量时间。

帮助表示赞赏!

标签: performancemonetdb

解决方案


推荐阅读