Green Plum测试报告

本文详细测试了GreenPlum在数据加载、数据查询、数据范围查询、数据更新和修改方面的性能。结果显示,GreenPlum在数据加载速度上比Oracle快20倍至100倍,数据查询性能提高3倍至20倍。特别地,对于IP范围查询,通过特殊处理,性能得到了显著提升,从原来的2500秒降低到约20秒,提高了100倍。

最近在EMC公司就Green Plum做了下测试,总体而言,测试效果还是很不错的,在这里非常感谢EMC测试人员的协助,希望有机会能够合作。

本文先后从数据加载、数据查询、数据范围查询、数据更新、修改方面对Green Plum做了相关测试,并给出了评测结论。

1.1  硬件环境

测试项目

Oracle11G

GreenPlum

Master 节点

GreenPlum

Segment 4节点

GreenPlum

Segment 8节点

主机节点数

2

2

4

8

CPU

2*4 intel 2.83GHz

2*6 intel 3.0GHZ

2*6  intel 2.93GHZ

2*6  intel 2.93GHZ

内存

16G

 

 

 

磁盘

146G*2(Raid1)

SAS 10K

6*300GB SAS(Raid5)

12*600GB SAS(Raid5)

12*600GB SAS(Raid5)

存储

DELL MD3200

6Gbps SAS

36*2T(2Hotspace)

2T*8+10T( Raid5)

N/A

N/A

N/A

网络

2*1Gb千兆网口

4*1 Gb千兆网口

2*1 10GB 万兆网口

2*1 Gb 千兆网口

2*1 10GB 万兆网口

2*1 Gb 千兆网口

2*1 10GB 万兆网口

交换机

3560千兆交换机

万兆交换机2台,千兆交换机1台

 

1.2   软件环境

 

Oracle

Green Plum

操作系统&版本

Oracle Linux5.6

Linux5.5

数据库&版本

Oracle 11g 11.2.0.2.0

Greenplum-db-4.1.1.3

 

 

 

 

 

 

 

2.1   加载性能测试

2.1.1    性能测试项目

测试项目

具体项目

Oracle

11G

GreenPlum

4节点

GreenPlum

8节点

Copy VS SQL loader

6400万

900秒

N/A

N/A

外部表 VS 外部表

6400万

N/A

63秒

50秒

6400万*3

N/A

130秒

76秒

Insert方式VS Insert方式

6400万

1800~9000秒

 

 

6400万*4

N/A

74秒

39秒

6400万*8

N/A

360秒

90秒

6400万*16

N/A

356秒

209秒

 

2.1.2    测试结果总结

从4节点与8节点的加载性能来看,性能和节点数量基本呈线性关系。

Green Plum与Oracle相比,数据加载的性能提高20倍~100倍不等。

 

 

 

 

 

 

2.2   SELECT性能测试

2.2.1    性能测试项目

标准查询语句性能测试

测试项目

具体项目

Oracle

11G

GreenPlum

4节点

GreenPlum

8节点

单分区分组

(参见相关语句)

Select

120秒

——

40

CTAS

33秒

17.5秒

12秒

Insert

——

11.9秒

5.3秒

八分区分组

(参见相关语句)

Select

500秒

——

77.6秒

CTAS

232秒

——

——

Insert

——

——

40.5秒

三十个分区分组

(参见相关语句)

CTAS

——

——

207.3秒

单分区与八个分区分组统计

(参见相关语句)

Select

437秒

67.1秒

56.1秒

CTAS

——

35.8秒

27.7秒

Insert

——

32.4秒

21.9秒

单分区与三十个分区分组统计

(参见相关语句)

Select

——

230.0秒

——

 

IP查询语句性能测试

测试项目

Oracle

11G

GreenPlum

4节点

GreenPlum

8节点

IP范围查询—by 转换后

(参见相关语句)

约1800秒

——

约2537秒

IP范围查询—by函数

(参见相关语句)

约18000秒

——

约36000秒

IP查询

(参见相关语句)

——

21秒

32~98秒

 

2.2.2    测试结果总结

从以上的测试数据来看,大批量的数据处理,都能够在所期望的时间内以很短的时间完成执行。通过4个节点与8个节点响应的SQL测试时间的比较来看,性能与节点数量基本上呈线性关系。

GreenPlum与Oracle相比,数据查询的性能提高3倍~20倍不等。(Oracle的测试结果已做过优化,GP则为无索引状态)

      基于IP范围查询的结果见补充说明

2.2.3    补充说明

对于IP范围查询(包括数字和函数比较),Green Plum和Oracle的执行性能均一般,GreenPlum还要更差一些。

为 了解决这个性能问题,Green Plum对IP表做了特殊处理,即把10999行的IP表拆分成1亿多条的IP明细表,采用等关联处理,即避开nestloop方式的join而使用更为 快速的hash join。修正效果显著,相同的数据关联从之前的约2500秒的处理时间降低到约20秒,有了100倍左右的提升。

2.3   UPDATE、DELETE性能测试

2.3.1    性能测试项目

测试项目

Oracle

11G

GreenPlum

4节点

GreenPlum

8节点

Update(30个分区)

——

——

130.7秒

Delete

——

——

12秒

2.3.2    测试结果总结

对于大批量数据的更新和删除,Green Plum的优势更加明显,Oracle还需要加以特殊处理(即分段处理)才能进行更新和删除。

Green Plum的Update有个小问题,批量增加字段会导致整个表的大小翻倍,可以通过表的在线分析进行压缩。

 

好的,我可以为你提供一个基于PyTorch实现的水果图像识别系统的代码示例。这个示例将使用Fruits 360数据集,并且将训练好的模型应用到一个基于PyQt5的图片识别界面中。同时,我们将使用GPU来加速训练模型,以便更快地获得准确的识别结果。 首先,我们需要安装PyTorch和PyQt5库,可以使用以下命令: ``` pip install torch pip install PyQt5 ``` 接下来,我们将定义一个用于加载Fruits 360数据集的函数。这个函数使用torchvision库来加载数据,并将数据集分成训练集和测试集。 ```python import torch import torchvision import torchvision.transforms as transforms def load_data(): transform = transforms.Compose( [transforms.Resize((64, 64)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.ImageFolder(root='./fruits-360/Training', transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=2) testset = torchvision.datasets.ImageFolder(root='./fruits-360/Test', transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False, num_workers=2) return trainloader, testloader ``` 然后,我们将定义一个用于训练模型的函数。这个函数将使用PyTorch的GPU加速来加速训练过程。 ```python def train_model(trainloader): device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") net = Net() net = net.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) for epoch in range(10): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # get the inputs; data is a list of [inputs, labels] inputs, labels = data inputs, labels = inputs.to(device), labels.to(device) # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 200 == 199: # print every 200 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 200)) running_loss = 0.0 print('Finished Training') return net ``` 接着,我们将定义一个用于测试模型的函数。这个函数将使用测试集上的图像来评估模型的准确率。 ```python def test_model(net, testloader): device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data images, labels = images.to(device), labels.to(device) outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 最后,我们将定义一个用于应用训练好的模型的函数。这个函数将加载训练好的模型,并使用PyQt5来实现一个简单的GUI界面,以便我们可以将图像加载到系统中,并使用训练好的模型来识别它们。 ```python from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PIL import Image import numpy as np class App(QWidget): def __init__(self): super().__init__() self.title = 'Fruit Recognition' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create a label self.label = QLabel(self) self.label.setGeometry(QRect(30, 30, 400, 400)) self.label.setAlignment(Qt.AlignCenter) # create a button button = QPushButton('Open', self) button.setGeometry(QRect(500, 30, 100, 30)) button.clicked.connect(self.open_image) self.show() def open_image(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog file_name, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Images (*.png *.xpm *.jpg *.bmp);;All Files (*)", options=options) if file_name: image = Image.open(file_name) image = image.resize((64, 64)) image = np.array(image) image = image.transpose((2, 0, 1)) image = image / 255 image = torch.from_numpy(image).type(torch.FloatTensor) image = image.unsqueeze(0) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") net = Net() net = net.to(device) net.load_state_dict(torch.load('fruits_model.pth')) outputs = net(image) _, predicted = torch.max(outputs.data, 1) self.label.setText('This is a ' + classes[predicted.item()] + '!') self.label.setPixmap(QPixmap(file_name).scaled(400, 400, Qt.KeepAspectRatio)) self.label.setAlignment(Qt.AlignCenter) if __name__ == '__main__': classes = ('Apple Braeburn', 'Apple Golden 1', 'Apple Golden 2', 'Apple Golden 3', 'Apple Granny Smith', 'Apple Red 1', 'Apple Red 2', 'Apple Red 3', 'Apple Red Delicious', 'Apple Red Yellow 1', 'Apple Red Yellow 2', 'Apricot', 'Avocado', 'Banana', 'Beetroot', 'Blueberry', 'Cactus fruit', 'Cantaloupe 1', 'Cantaloupe 2', 'Carambula', 'Cauliflower', 'Cherry 1', 'Cherry 2', 'Cherry Rainier', 'Cherry Wax Black', 'Cherry Wax Red', 'Cherry Wax Yellow', 'Chestnut', 'Clementine', 'Cocos', 'Dates', 'Eggplant', 'Fig', 'Ginger Root', 'Granadilla', 'Grape Blue', 'Grape Pink', 'Grape White', 'Grape White 2', 'Grape White 3', 'Grape White 4', 'Grapefruit Pink', 'Grapefruit White', 'Guava', 'Hazelnut', 'Huckleberry', 'Kaki', 'Kiwi', 'Kohlrabi', 'Kumquats', 'Lemon', 'Lemon Meyer', 'Limes', 'Lychee', 'Mandarine', 'Mango', 'Mangostan', 'Maracuja', 'Melon Piel de Sapo', 'Mulberry', 'Nectarine', 'Orange', 'Papaya', 'Passion Fruit', 'Peach', 'Peach Flat', 'Pear', 'Pear Abate', 'Pear Monster', 'Pear Williams', 'Pepino', 'Pepper Green', 'Pepper Red', 'Pepper Yellow', 'Physalis', 'Physalis with Husk', 'Pineapple', 'Pineapple Mini', 'Pitahaya Red', 'Plum', 'Plum 2', 'Plum 3', 'Pomegranate', 'Pomelo Sweetie', 'Potato Red', 'Potato Red Washed', 'Potato Sweet', 'Potato White', 'Quince', 'Rambutan', 'Raspberry', 'Redcurrant', 'Salak', 'Strawberry', 'Tamarillo', 'Tangelo', 'Tomato 1', 'Tomato 2', 'Tomato 3', 'Tomato 4', 'Tomato Cherry Red', 'Tomato Maroon', 'Tomato Yellow', 'Walnut') trainloader, testloader = load_data() net = train_model(trainloader) test_model(net, testloader) torch.save(net.state_dict(), 'fruits_model.pth') app = QApplication(sys.argv) ex = App() sys.exit(app.exec_()) ``` 注意,这个示例中我们使用了一个名为Net的神经网络模型,你可以根据需要进行替换。 至此,我们已经完成了一个基于PyTorch的水果图像识别系统的实现。你可以使用这个示例作为起点,根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值