首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有可能加速这个算法吗?

有可能加速这个算法吗?
EN

Stack Overflow用户
提问于 2015-05-18 09:17:55
回答 1查看 153关注 0票数 1

我想加快红宝石算法的速度。我有一个rails应用程序,它使用active record和nokogiri访问数据库中的url列表,并从页面中抓取主图像,并将其保存在与该url关联的图像属性下。

这个rails任务通常需要2:30才能完成,我正试图加快它的速度,作为一个学习练习。是否可以通过RubyInline和原始SQL代码使用C来实现所需的结果?我唯一的问题是,如果我使用C,我就失去了与ruby的活动记录的数据库连接,并且不知道如何与正确连接到我的db的C代码一起编写SQL查询。

有没有人有过这方面的经验,甚至知道这是否可能?我这样做主要是作为一个学习练习,我想知道这是否可能。如果您感兴趣,下面是我想转换成C和SQL的代码:

代码语言:javascript
复制
task :getimg => :environment do

    stories = FeedEntry.all

    stories.each do |story|

        if story.image.nil?

            url = story.url

            doc = Nokogiri::HTML(open(url))

            if doc.at_css(".full-width img")
                img = doc.at_css(".full-width img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".body-width img")
                img = doc.at_css(".body-width img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".body-narrow-width img")
                img = doc.at_css(".body-narrow-width img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".caption img")
                img = doc.at_css(".caption img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".cnnArticleGalleryPhotoContainer img")
                img = doc.at_css(".cnnArticleGalleryPhotoContainer img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".cnn_strylftcntnt div img")
                img = doc.at_css(".cnn_strylftcntnt div img")[:src]
                story.image = img
                story.save!
            elsif doc.at_css(".cnn_stryimg640captioned img")
                img = doc.at_css(".cnn_stryimg640captioned img")[:src]
                story.image = img
                story.save!
            end
        else
            #do nothing
        end
    end
end

我希望在这件事上有任何帮助和见解。提前谢谢你!!

EN

回答 1

Stack Overflow用户

发布于 2015-05-18 09:44:39

  1. URL是远程的吗?如果是的话,首先对其进行基准测试,以查看网络延迟。如果这是瓶颈,我认为您与代码或语言选择无关。
  2. 您的数据库中有多少FeedEntry?我建议使用FeedEntry.find_each而不是FeedEntry.all.each,因为前者将1000个条目加载到内存中,处理它们,然后加载接下来的1000个条目……而后者将所有条目加载到内存中,然后遍历它们,这需要更多的内存并增加GC周期。
  3. 如果瓶颈不是上述瓶颈之一,那么可能是DOM节点搜索算法速度慢。您可以找到(只有一个?) img节点,然后在必要时检查它的父节点或祖父母节点,并相应地更新条目。 image_node = doc.at_css('img') story.update图像:如果需要的话,图像_节点的if‘?(Image_node) def需要?(Image_node) parent_node = image_node.parent parent_class =image_node.父’‘class’‘class’返回true如果parent_class ==‘全宽’返回真如果parent_class ==‘身体宽度’返回真如果parent_class ==‘身体-窄-宽度’返回真如果parent_class ==‘身体-窄宽度’返回真如果parent_class == 'cnnArticleGalleryPhotoContainer‘返回true如果parent_class == 'cnn_stryimg640captioned’返回false,除非parent_node.node_type == 'div‘返回true如果家长_node.parent’‘class’== 'cnn_strylftcntnt‘false结束
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30299296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档