zl程序教程

您现在的位置是:首页 >  其它

当前栏目

从非GP到GP

GP
2023-09-27 14:27:55 时间
第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能最终解决问题,隐患仍然存在。假如有人足够耐心,还是可以使你的这个经过纠正后的程序崩溃的。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。
第一个代码是没有STL时候的代码:
None.gif// name:example2_1.cpp
None.gif// alias:Rubish
None.gif
None.gif#include  stdlib.h
None.gif#include  iostream.h
None.gif
None.gifint compare(const void *arg1, const void *arg2);
None.gif
None.gifvoid main(void)
ExpandedBlockStart.gif{
InBlock.gif    const int max_size = 10;        // 数组允许元素的最大个数
InBlock.gif    int num[max_size];            // 整型数组
InBlock.gif
InBlock.gif    // 从标准输入设备读入整数,同时累计输入个数,
InBlock.gif    // 直到输入的是非整型数据为止
InBlock.gif    int n;
InBlock.gif    for (n = 0; cin   num[n]; n ++);
InBlock.gif
InBlock.gif    // C标准库中的快速排序(quick-sort)函数
InBlock.gif    qsort(num, n, sizeof(int), compare);
InBlock.gif
InBlock.gif    // 将排序结果输出到标准输出设备
InBlock.gif    for (int i = 0; i   i ++)
InBlock.gif        cout   num[i]   "\n";
ExpandedBlockEnd.gif}
None.gif
None.gif// 比较两个数的大小,
None.gif// 如果*(int *)arg1比*(int *)arg2小,则返回-1
None.gif// 如果*(int *)arg1比*(int *)arg2大,则返回1
None.gif// 如果*(int *)arg1等于*(int *)arg2,则返回0
None.gifint compare(const void *arg1, const void *arg2)
ExpandedBlockStart.gif{
InBlock.gif    return    (*(int *)arg1   *(int *)arg2) ? -1 :
InBlock.gif            (*(int *)arg1   *(int *)arg2) ? 1 : 0;
ExpandedBlockEnd.gif}
None.gif
如果要考虑到健壮性,可以有以下方案:
采用大容量的静态数组分配。 限定输入的数据个数。 采用动态内存分配。

第一种方案比较简单,你所做的只是将max_size改大一点,比如:1000或者10000。但是,严格讲这并不能最终解决问题,隐患仍然存在。假如有人足够耐心,还是可以使你的这个经过纠正后的程序崩溃的。此外,分配一个大数组,通常是在浪费空间,因为大多数情况下,数组中的一部分空间并没有被利用。

再来看看第二种方案,通过在第一个for循环中加入一个限定条件,可以使问题得到解决。比如:for (int n = 0; cin num[n] n max_size; n ++); 但是这个方案同样不甚理想,尽管不会使程序崩溃,但失去了灵活性,你无法输入更多的数。

看来只有选择第三种方案了。是的,你可以利用指针,以及动态内存分配妥善的解决上述问题,并且使程序具有良好的灵活性。这需要用到new,delete操作符,或者古老的malloc(),realloc()和free()函数。但是为此,你将牺牲程序的简洁性,使程序代码陡增,代码的处理逻辑也不再像原先看起来那么清晰了。一个compare函数或许就已经令你不耐烦了,更何况要实现这些复杂的处理机制呢?很难保证你不会在处理这个问题的时候出错,很多程序的bug往往就是这样产生的。同时,你还应该感谢stdlib.h,它为你提供了qsort函数,否则,你还需要自己实现排序算法。如果你用的是冒泡法排序,那效率就不会很理想。……,问题真是越来越让人头疼了!

下面再来看看STL后的代码:

None.gif// name:example2_2.cpp
None.gif// alias:The first STL program
None.gif
None.gif#include  iostream
None.gif#include  vector
None.gif#include  algorithm
None.gif
None.gifusing namespace std;
None.gif
None.gifvoid main(void)
ExpandedBlockStart.gif{
InBlock.gif    vector int  num;        // STL中的vector容器
InBlock.gif    int element;
InBlock.gif
InBlock.gif    // 从标准输入设备读入整数, 
InBlock.gif    // 直到输入的是非整型数据为止
InBlock.gif    while (cin   element)
InBlock.gif        num.push_back(element);
InBlock.gif
InBlock.gif    // STL中的排序算法
InBlock.gif    sort(num.begin(), num.end());
InBlock.gif
InBlock.gif    // 将排序结果输出到标准输出设备
InBlock.gif    for (int i = 0; i   num.size(); i ++)
InBlock.gif        cout   num[i]   "\n";
ExpandedBlockEnd.gif}
greenplum(gp)的常用命令 下面列举一些gp数据库的常用命令,这只是其中的一部分 连接gp命令: psql -d 库名 -h ip地址 -p 端口号 -U 用户名; gp 添加分区: alter table 表名 add partition d20190611 values( 20190611 gp 添加字段: alter table 表名 add column update_flag varchar(255); gp 重命名: alter table 表名 rename column old_column_name to new_column_name;
在空间数据中,通常会有轨迹、点、面的数据,假设有两张表,一张为面的表,一张为点的表,使用包含 ST_xxxx(c.geom, p.geom) 来进行JOIN(例如以面为单位,聚合统计点的数量)。
由于GP为分布式数据库,当查看它的一些日志时,如果到服务器上查看,会非常的繁琐,而且不好排查问题。
pt-tools系列:pt-online-schema-change 最佳实践 pt的详细步骤 Step 1: Create the new table. Step 2: Alter the new, empty table. This should be very quick, or die if the user specified a bad alter statement.