当前位置: 首页 > 面试题库 >

简单但繁重的应用程序消耗大量资源。如何优化?

符献
2023-03-14
问题内容

目前,我在生产中有一个监视器应用程序。该监视器的工作是收集社交网络上的特定条目,如Facebook,Twitter,YouTube等。

这是一个来自Twitter的API调用的简单示例:

http://search.twitter.com/search?q=Stackoverflow&format=json

基本上,这就是系统的作用:

  1. 给定特定顺序,从数据库中选择搜索词
  2. 调用API
  3. 从当前搜索中收集所有推文状态ID和用户ID
  4. 检查数据库是否存在
  5. 运行推文插入,消除现有的推文和用户,并防止重复的输入错误。

我们完成了两个表,一个表用于用户,另一个表用于tweet。

问题

在MySql数据库达到tweets表上的200.000条目之后(在最初的几个月中),可视化该数据的应用程序在对现有tweet执行选择查询时开始消耗太多资源。

为什么?

该系统具有独立的帐户,每个帐户都有与其特定业务相关的某些搜索词。执行选择时,我们只需要选择与我们的帐户条款相关联的内容。我们看不到与我们无关的推文。但是一条推文可能涉及多个帐户。

实际查询(伤了我的眼睛)

SELECT * 
   FROM tweets 
 WHERE 
   content LIKE '%searchterm1%' 
     OR LIKE '%searchterm2%' 
     OR LIKE '%searchterm3%' 
     OR LIKE '%searchterm4%' 
     OR LIKE '%searchterm5%' 
     OR LIKE '%searchterm6%' 
     OR LIKE '%searchterm7%' 
     OR LIKE '%searchterm8%' 
   (and son on...)

两种可能的解决方案

a)创建一个tweets_searches表,该表将具有两个外键:tweet_id和search_id。这样tweets表上的每个tweet都可以与一个特定的搜索词相关。

因此,我们将搜索这些表,而不是搜索特定的字符串

b)继续搜索,但是使用进行全文搜索MATCH () AGAISNT ()

主要问题

这足以减少CPU和RAM等资源消耗吗?有什么我可以做的更好的吗?


问题答案:

免责声明 :这是我对此问题的评论之一,可能是答案:

我认为这match ... against是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我会使用Sphinx-它自己对数据库建立索引(具有自己的机制),并且执行查询的速度比MySQL快



 类似资料:
  • 我正在我的GTX 1060 6gb上使用Python中的Tensorflow 1.2训练LSTM。 在每个时代,我用这种方法保存模型: 一切正常,但在九个时代之后,当我试图用这种方法保存模型时,我得到了ResourceExhaustedError。 我在培训期间检查了我的资源,但没有耗尽任何资源。 我得到的错误如下: 2017-06-29 12:43:02.865845: W tenstorflo

  • 问题内容: 我的问题: 当线程处于状态(非休眠)> 99.9%的时间时,JVM中的大量线程是否会消耗大量资源(内存,CPU)吗?当线程正在等待时,如果根本需要维护它们,需要花费多少CPU开销? 答案是否也适用于与非JVM相关的环境(例如linux内核)? 内容: 我的程序收到大量占用空间的程序包。它在不同的程序包中存储相似属性的计数。在收到包裹后的给定时间(可能是数小时或数天)之后,该特定包裹将过

  • 我正在Openshift环境中部署一个Spring boot Web应用程序。由于我们在同一个引导项目中使用JSP和CSS等Web组件,因此我们将应用程序部署为Openshift环境中的WAR文件。我还添加了tomcat-embed-jasper来解析这些Web组件并执行WAR文件。 但问题是,当我在Openshift环境中部署它时,应用程序消耗了超过1GB的资源。有什么方法可以减少应用程序的内存

  • null 在这两种实现中,REST控制器都直接从存储库中获取数据,并将其作为列表RESP返回。作为通量。不执行进一步的应用程序逻辑。 我们对100个调用服务的用户进行了一个小型负载/性能测试,我们发现非反应实现的性能远远好于反应实现。 事实上,非反应实现不仅有更好的HTTP吞吐量,而且更有趣的是,它比反应实现消耗更少的CPU和线程!这与预期尤其相反,因为我们预期反应版本只需少量线程即可扩展,如ht

  • 问题内容: 为了限制Java 7应用程序消耗的总内存,我可以使用以下公式(摘自本文): 最大内存= [-Xmx] + [-XX:MaxPermSize] +线程数* [-Xss] 删除PermGen之后,此公式对于Java 8应用程序将如何更改? 我应该使用选项“ -XX:MaxMetaspaceSize”来限制元空间消耗的最大内存吗? 问题答案: 是的,这里有代替。 还考虑限制直接ByteBuf

  • 问题内容: 我有作为Java类的资源束,可从数据库中读取值。当我更新数据库时,我需要重新加载捆绑软件,但我不知道如何。有人帮忙吗? 鉴于我使用捆绑如下: 问题答案: 要么 调用此方法将重新加载资源,它将刷新包 参考