2012-03-30 72 views
0

我想优化发布的http请求。我的系统由服务器和客户端组成。 客户端发送图像,服务器将其保存在数据库中。如何在RoR中加速发布http请求

这是请求:

res = Net::HTTP.post_form(uri, :mac => 'String', :value => 'ImageData(stringa di 22k circa)')

服务器进行此操作与数据库:

Started POST "/events/save_photo" for 192.168.0.113 at 2012-03-30 09:27:27 +0200 
     Processing by EventsController#save_photo as */* 
     Parameters: {"data_type"=>"image", "value"=>"!binary |\n   /9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhE...(very long parameter", "created_at"=>"2012-03-     30 09:26:29 +02:00", "mac"=>"00606E91E5D2"} 
    WARNING: Can't verify CSRF token authenticity 
     `[[ (0.3ms)] [1mSET PROFILING=1] 
     [[Device Load (1.2ms)] SELECT SQL_NO_CACHE `devices`.* FROM `devices` WHERE `devices`.`mac` = '00606E91E5D2' LIMIT 1 
     [[CACHE (0.0ms)] [1mSELECT `devices`.* FROM `devices` WHERE `devices`.`mac` = '00606E91E5D2' LIMIT 1] 
     [[(0.4ms)] BEGIN 
     [[SQL (2.3ms)] [INSERT INTO `multimedia` (`created_at`, `data`) VALUES ('2012-03-30 07:26:29', x'f22b19237b63f1c8c40da49ae5eb68969dd3cf28193ba...',)] 
     [[ (61.9ms)] COMMIT 
     [[ (0.2ms)] [BEGIN] 
     [[SQL (0.6ms)] INSERT INTO `events` (`created_at`, `data_type`, `device_id`, `element_id`, `multimedia_id`, `name`, `status`, `updated_at`, `value`) VALUES ('2012-03-30 07:26:29', 'image', 23, 163785, 1065577, 'photo', NULL, '2012-03-30 07:27:28', '--- 0\n...') 
     [[ (36.6ms)] [COMMIT] 
     [[35m (0.3ms)] BEGIN 
     [[ (0.4ms)] [SET PROFILING=1] 
     [[ (1.1ms)] SELECT SQL_NO_CACHE 1 FROM `devices` WHERE (`devices`.`mac` = BINARY '00606E91E5D2' AND `devices`.`id` != 23) LIMIT 1 
     [[ (0.8ms)] [UPDATE `devices` SET `elem_photo_id` = 163804, `updated_at` = '2012-03-30 07:27:30' WHERE `devices`.`id` = 23] 
     [[ (78.9ms)] COMMIT 
    Rendered events/save_photo.html.erb (0.2ms) 
    Completed 200 OK in 358.4ms (Views: 11.6ms | ActiveRecord: 246.2ms)` 

在我看来这一次是不能接受的。我会认为这个操作变得更快!可能吗?

做的注意,我不使用Base64编码,这种方法使图像串长,我必须节省内存

+0

以及为什么当查看时间+ ActiveRecord时间为257ms时总时间为358ms? – Dabidi 2012-03-30 09:03:05

+0

在文件系统中保存图像,这会给你一些性能提升 – 2012-03-30 11:23:34

回答

0

正如你所看到的大部分时间都花在写入数据库(246.2ms) - 你使用哪个数据库?

如果您需要快速的数据库,您可以使用非关系数据库,如redismongoDB。当你说你必须保存'内存'是否意味着磁盘空间或内存?因为这种非关系数据库将数据存储在RAM中(不必担心存在持续的可能性)。

+0

磁盘空间....服务器机器没有太多的硬盘空间,系统必须保存很多图像 – Dabidi 2012-03-30 11:28:27

+0

但是我使用MySql ...现在我修改了代码,客户端在一个请求中发送了10张照片。服务器花费了1.9秒来保存...但请求的总时间为3,8秒! :-S 我该怎么办? – Dabidi 2012-03-30 11:30:39

+0

为什么你甚至将图像数据存储到数据库中?将图像数据写入图像文件会更快,我猜。写入数据库只需**需要时间**。这不是我的眼中的http/rails问题,而是一个MySQL性能问题。如果您确实需要将图像数据字符串存储在数据库中,请查看[MySQL性能提示](http://forge.mysql.com/wiki/Top10SQLPerformanceTips)。 – 2012-03-31 10:15:23