`
guafei
  • 浏览: 326672 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

访问量定时程序总结

阅读更多
感谢当当,在跑写这个程序的时候,当当让我了解了很多新的知识

这是两个比较经典的提问:
http://topic.csdn.net/u/20071119/23/8af044b3-8c28-4db0-8303-4a8679f2356d.html
http://topic.csdn.net/u/20071209/10/c01ad9da-08cb-452c-9230-dff429619361.html

本程序要做的事情是:从cache服务器中读取店铺访问量数据,然后入库。
问题的难点 :
1 :全国所有店铺的key(city_storeId)有750万,数据量很大,导致跑的时候经常内存溢出
2 :解决了读数据的问题,但是跑这么多数据速度很慢,需要6个多小时,则思考了很多方法


问题一解决方式:
之前我是用buffedreaded类的readline方法一行一行的读取,然后放在list里面,在通过遍历list去做更新操作。这明显是不行的,把所有数据放在list导致内存溢出,放不了那么多数据。
之后放弃这个方式,在buffedreaded类的readline方法读取时就进行数据库的入库操作,因为readline方法每次读取一定量的数据到内存,假设100条key,然后放到队列里,接着就一条一条的更新,所以不会导致内存溢出,但是出现一个问题,就是跑的时间太慢

问题二解决方式:
想了很多方式:有想到用NIO来提高IO读取的效率,也有想到用多线程,分割文件来跑,最后还是用到了多线程,这个要感谢当当,有个例子给我,也让我第一次接触了多线程的current包(想当初就是没有回答上这个包,才被淘宝拒绝的)。刚开始进入了一个误区,还以为是读取文件慢了,结果是因为操作数据库太慢了。mysql数据库每秒可以接受500-1000的并发量,那么750万数据,怎么算都至少跑2个小时(7500000/1000/3600)。所以只能通过加mysql数据库集群才能使速度加快。

找个时间好好学习下current包
ExecutorService fixedPool =Executors.newFixedThreadPool(poolSize); 

还有用多线程跑的时候还出现了内存溢出的问题,问了当当之后,通过调整了eclipse的jvm虚拟机的内存(从原来的252M调整到1G),还有就是把线程引用对象读到队列里的时候,每50万条,sleep(5000),不要一下子加载。

下面是代码:

线程类代码
       //判断静态类是否有重复创建,可以用此来判断
        private static int count = 0;
       private static Score dianHitsScore;
private static IStoreExtService storeExtService;
public ThreadForVisit(String data) {
this.data = data;
}
static {
ApplicationContext context = new ClassPathXmlApplicationContext(
"CateVisitTimer.application.xml");
dianHitsScore = (Score) context.getBean("dianHitsScore");
storeExtService = (IStoreExtService) context.getBean("storeExtService");
}
public void run() {
Integer score = null;
//    int entity_total = 0; // entity为null数据条数的总数
// int cache_total = 0; // cache中无数据的条数的总数
// int update_total = 0; // 访问量更新的数据条数的总数
try {
String storeId = getCityAndStoreId(data);
score = dianHitsScore.get(data);
if (score != null && score.intValue() > 0) {
StatisticEntity entity = storeExtService.getStatisticById(storeId);

if (entity != null) {
entity.setTotal(score.intValue());
// 这个读取数据库的操作已经用了多线程
storeExtService.updateStatistic(entity, storeId);
//update_total++;
//logger.info(data + "=" + entity.getTotal());
//Thread.sleep(100);
} else {
//entity_total++;
//logger.info(entity + "为null!");
}
} else {
//cache_total++;
//logger.info(data + "cache 中无数据!");
}
count ++;
if(count % 10000 == 0){
System.out.println("=============="+count);
}
} catch (Exception e) {
logger.info("ThreadForVisit类的run方法中的Thread.sleep(100)出问题");
}
}

main函数跑的代码
ExecutorService fixedPool = Executors.newFixedThreadPool(poolSize);

int count = 0;
if (data != null) {
try {
//速度慢不是由于读文件上的浪费,而是对数据库操作时候的慢
BufferedReader buff = new BufferedReader(new FileReader(data));
while ((data_part = buff.readLine()) != null) {
fixedPool.execute(new ThreadForVisit(data_part));
if((++count % 500000) == 0){
System.out.println("数据达到50万");
Thread.sleep(5000);
}
}
} catch (Exception e) {
logger.info("store访问量定时程序异常");
}
}


其实里面还设计到很多调试代码的技巧:分开测每个数据库操作所需要的时间
分享到:
评论

相关推荐

    非常完美Java实现年、月、日、周访问量统计

    为了实时更新访问量,我们可以设置一个定时任务,如使用`ScheduledExecutorService`,每隔一段时间(例如每分钟)检查新的访问记录并更新统计。 最后,为了便于分析,我们还可以提供各种聚合和查询功能,如按时间段...

    安卓小程序 定时静音

    总结来说,"安卓小程序 定时静音"是一个利用安卓系统API,尤其是AlarmManager和AudioManager服务,实现定时切换手机静音和恢复音量功能的应用。它的设计和实现涵盖了安卓小程序开发的基础、通知管理、定时任务、音量...

    定时程序使用教程

    ### 定时程序使用教程:WakeupOnStandBy 功能详解 #### 一、引言 在现代计算机系统中,为了提高效率与节能性,定时唤醒功能变得越来越重要。WakeupOnStandBy(以下简称 WOSB)是一款强大的工具,旨在帮助用户轻松...

    工作日志周报定时提醒小程序

    小程序作为一种轻量级的应用形式,无需安装即可使用,适合在各种设备上快速访问。在“工作日志周报定时提醒小程序”中,开发者可能采用了HTML5、CSS3和JavaScript等Web技术,结合微信小程序框架进行开发。此框架提供...

    定时自动打开指定网站

    这样的功能对于提高特定网站的Alexa排名非常有用,因为Alexa排名是根据网站的访问量和用户行为来评估的。通过定时访问,可以模拟用户活动,间接提升网站的在线表现。 首先,我们需要了解Java编程语言的基础。Java是...

    Web后端开发-使用Filter过滤器技术,实现访问量统计

    3. 滞后更新:为了优化性能,可以设置定时任务,每隔一段时间才将内存中的访问量写入持久化存储,并清零内存计数。 四、Filter的其他应用场景 1. 权限验证:Filter可以用来检查用户是否登录,未登录的用户重定向到...

    网站访问量

    总结来说,要实现“网站访问量”这一功能,我们将使用ASP.NET进行后端开发,处理数据并生成图表;使用数据库存储和管理访问数据;选择合适的数据可视化库创建美观的图表;并通过响应式设计确保跨平台的用户体验。这...

    C# 定时爬虫

    本篇文章将详细讲解如何利用C#实现一个简单的定时爬虫程序,以及涉及到的关键技术点。 首先,让我们从“C# 爬虫”这个概念开始。爬虫,也称为网络爬虫或网页抓取器,是一种自动化程序,用于从互联网上抓取大量信息...

    zblog2.0批量定时发布教程

    在运行该程序之前,请确保你有权限访问并修改ZBlog的文章数据库,因为批量操作会涉及到数据库的读写操作。 批量定时发布的步骤大致如下: 1. **数据准备**:你需要先在ZBlog后台创建或导入待发布的文章,这些文章...

    基于微信平台的个人健康信息管理小程序(源码)

    微信小程序是一种轻量级的应用开发平台,由腾讯公司于2017年推出,旨在提供“触手可及”的便捷服务。它无需下载安装即可使用,极大地降低了用户获取应用的门槛,同时也为企业和个人开发者提供了快速构建应用的新途径...

    net实现定时任务(Cache+HttpModule)

    这种方式适用于需要在ASP.NET应用程序中执行轻量级定时任务的场景。不过需要注意的是,这种方法依赖于应用程序保持运行状态,一旦应用程序停止或重启,定时任务也会随之停止。对于更复杂的需求,建议考虑使用更专业...

    基于SpringBoot+Vue的轻量级定时任务管理系统.zip

    总结来说,这个项目结合了SpringBoot的后端实力和Vue.js的前端优势,构建了一个适用于中小型企业或个人的定时任务管理系统。开发者可以通过调整配置、扩展功能,以满足特定场景下的任务调度需求。

    VC++编写的定时关机小工具

    总结来说,"VC++编写的定时关机小工具"是一款利用VC++和MFC库,结合Windows API,实现定时关机功能的轻量级应用。它具备系统托盘集成,便于用户管理和使用,通过精确的计时器机制和API调用来完成自动关机任务,同时...

    pc定时关机软件

    总结来说,“pc定时关机软件”为Windows XP和Windows 7用户提供了一个方便的方式来规划他们的电脑使用时间,确保在特定时间自动关机,提高效率并节省资源。通过安装ShutDownSetup.exe文件,并参考?!必读说明.txt中...

    vb定时删除ie缓存

    【VB定时删除IE缓存】 ...总结来说,VB定时删除IE缓存是一个实用的系统维护工具,它结合了VB的编程能力、Windows API调用和时间管理功能,为用户提供了一种自动化清理浏览器缓存的方法,有助于保护隐私和优化系统性能。

    一个检测优盘的小程序和大家分享

    总结,这个检测优盘的小程序利用了操作系统提供的API和事件机制,实现了自动检测和复制优盘内文件的功能,极大地提升了数据传输的便利性。然而,开发者在设计此类工具时需兼顾安全性和用户隐私,以确保其在实用的...

    易语言控制子程序暂停继续运行源码.zip

    总结来说,"易语言控制子程序暂停继续运行源码.zip"是一个易语言编程的学习资源,它涵盖了多线程控制、子程序暂停与恢复、以及潜在的线程同步和通信等内容。通过分析和实践这个示例,初学者可以加深对易语言的理解,...

    定时百度统计获取基础概况数据

    通常,API返回的数据可能是JSON格式,我们需要解析这些数据,提取需要的部分,如访问量、独立访客数等。然后,使用`pyodbc`(Python的ODBC驱动)或其他类似的库,将这些数据保存到`SQLServer`数据库中。 在`.NET ...

    中断与定时系统资料PPT学习教案.pptx

    总结来说,中断系统和定时系统是单片机系统中不可或缺的组成部分,它们提供了灵活的数据传输机制和实时响应能力。理解中断的原理和MCS-51中断系统的特性,以及掌握定时/计数器的配置和应用,对于开发高效、可靠的...

    C#做的一个自动定时关机(API函数的基本运用)

    API使得开发者能够更容易地访问操作系统、硬件、网络服务等底层功能。在本例中,我们讨论的是如何使用C#编程语言结合API来实现自动定时关机、注销和重启计算机的功能。 首先,C#本身并不直接提供系统级的定时关机、...

Global site tag (gtag.js) - Google Analytics