这段时间在Code Review之余负责一个处理大数据量程序的正常运行。本应该是国庆之前完成的事,但因对程序处理能力的认识不足就拖到了现在。程序由单线程改造为并发,并因此修改当初的设计,后来针对出现的问题做持续的处理及优化。下面列出在完成这个任务时所想到的及问题总结
1. 由使用并发看到的
在处理大数据量任务时,可以做到的要么提高执行效率,要么并发执行。如果在单线程效率达到瓶颈时,不得不引入并发,并面对随之而来的问题。在我的程序中,多线程删除某个目录下的所有文件,或是多线程往同一文件中写数据,都得考虑同步时的争锁问题。
- 线程数量有阈值,并不是越多越好。因应用而定,对共享的争用是需要权衡的。
- 设置条件,减少多线程进入同步块的机会。如每条线程执行500条数据,才去检查共享目录的文件。
- 在频繁出现资源争用的情况时,为不同线程设置不同的sleep时间,错开执行。
2. 持续优化可以确定的性能瓶颈
优化绝对是建立在对已有程序执行效率的分析结果上。在我的程序中经历的优化有:在单线程性能已无法提高时,选择多线程 --> 解决线程争用共享资源 --> 排除很多无效数据也要下载文件且占据网络资源的情况 --> 解决部分数据依赖于第三方jar包,长时间没有数据返回的问题等。优化之前在可能出现性能问题的地方设置时间点,分析执行时间,以执行时间为依据做代码review。
3. 让程序更聪明些
在程序运行期,我们希望得到它的执行进度、效率、指出程序瓶颈在哪,更期望程序从主动从问题中恢复,这些要求在程序开发阶段不会考虑太全,需要经过实践的验证,并不断补充。这个问题以前就认识到,但要写出些能上得了台面的东西,还是需要不断积累。
- 在网络超时,系统负载高的时候能减缓执行,反之加快执行速度。
- 如果某些资源在使用一段时间后频繁出现访问延时,就每隔一段时间重启执行程序。
- 分析每个线程的执行效率,或分析线程数量的较优解
- ... ...
4. 对BufferedWriter的并发访问
程序中多线程往同一文件中写数据,使用BufferedWriter。之前没有看过BufferedWriter的代码,在访问BufferedWriter之前做同步处理,并在每次append()之后都做flush()操作,造成程序性能损耗严重。在同事的提醒下,修正为每个线程执行N次后再做flush。
看了下BufferedWriter的代码,对上面的两个问题的解释:
1. 多线程访问BufferedWriter是否需要同步
BufferedWriter自带锁,同步对流的访问,所以在外面的同步可要可不要。(append同write方法)
protected Object lock;
public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
}
2. 如果append后不做flush,谁来flush
BufferedWriter自设缓存,且默认大小为8K,大小可修改。
private char cb[];
private static int defaultCharBufferSize = 8192;
public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
}
在往BufferedWriter写数据时,当它发现缓存已满,就将缓存数据写入流中,将新到的数据再次放入缓存中。也就是说如果程序不主动flush的话,当数据值积累到默认缓存大小时,BufferedWriter会自动将缓存数据flush入writer流中。
还有,当BufferedWriter关闭的时候,也会把所有缓存数据自动flush.
public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try {
flushBuffer();
} finally {
out.close();
out = null;
cb = null;
}
}
}
分享到:
相关推荐
【文档标题】与【描述】并未提供具体的技术性或IT相关的信息,而是关于人生感悟的散文随笔。因此,从这些信息中无法直接提取出IT行业的知识点。但是,如果我们将这些人生哲理与IT行业相结合,可以衍生出一些关于工作...
【标题解析】:“把不字去掉感悟随笔.docx”这个标题暗示了一种自我挑战和积极进取的态度。在个人成长和事业发展过程中,我们往往会遇到自我设限的情况,"不"字成为了阻碍进步的心理障碍。标题旨在提醒我们,要去除...
【学习随笔——张明明.doc】这篇文档记录了作者张明明在进行网络远程研修学习过程中的感悟和收获。从内容来看,这篇文章突出了几个重要的教育理念和学习方向: 1. **转变观念**:首先,张明明认识到教育观念的转变...
这篇文档实际上是对个人学习生活感悟的总结,虽然标签为"方案",但内容更偏向于个人体验和情感表达。从这段文字中,我们可以提炼出以下几个与学习、生活和自我认知相关的知识点: 1. 学习环境的影响:作者提到在...
【标题】:人生随笔六篇 - 感悟人生的散文随笔精选 【标签】:资料 【主要内容】:本文由六篇散文随笔组成,主题围绕着人生的感悟和体验,探讨了幸福、压力、适应、释放、微笑以及面对困难的态度。作者通过比喻...
【校长信息化学习感悟总结】 信息化时代的教育领导力不仅关乎技术的应用,更关乎教育者的情感态度和价值观念。校长作为学校教育的领航者,其信息化学习的感悟与实践对于整个教育体系的影响深远。孙召校长的随笔揭示...
【老年感悟】这篇散文随笔探讨了人到老年时对生活和自我认知的深刻转变。随着年龄的增长,人们开始意识到生命的有限性,这促使他们更加珍视时间,采取行动去追求那些曾经未能实现的愿望。老年人逐渐认识到,真正的...
3. 平衡与和谐:世间万物追求平衡,一旦失去平衡,生活就会出现问题。过分关注回报或结果可能导致心理失衡,而不计回报的付出则可能带来意想不到的惊喜和收获。 4. 无私与高尚:无私和无贪念的态度可以防止罪恶接近...
文章中提到一位教师准备了专门的反思记录本,记录日常教学中的点滴感悟。这体现了积极态度在反思过程中的重要作用。只有保持乐观向上的态度,教师才能在面对困难和挑战时,找到解决问题的方法,并从中汲取教训,实现...
6. **观察生活与感悟**:最后一篇随笔描述了公共场景中的日常,表明观察生活、提炼感悟对于个人成长的价值。在IT行业,从日常生活中寻找灵感,解决实际问题,也是创新的重要来源。 虽然这些内容并非直接的IT技术...
而随笔则更为随意,通常是作者对某一主题的即时感悟,篇幅短小,但富有哲理。 2. **黄牛的写作特色**:虽然没有具体信息,但我们可以推测黄牛可能以其独特的视角、深刻的人生洞察力或是生动的叙述技巧著称。他的...
标题“在笑声中飞走劳累”暗示了作者试图探讨如何通过愉快的教学氛围减轻教师的工作压力,同时增强幼儿的学习乐趣。教育随笔是一种个人观察、反思和经验分享的形式,通常包含对教育理念、教学方法和师生互动的深度...
教师在这篇随笔中展现了一个既是教育者又是学习者的形象。他们愿意倾听、反思,不断学习和调整自己的教育策略,以更好地适应学生的成长需求,体现了教师专业发展的重要性。 【总结】 这篇随笔揭示了教育的核心不...
【标签】中的“事业编”可能指的是这篇随笔是作为某项工作、学习任务的一部分,或者与个人职业发展或事业编制考试有关,强调了阅读对于个人成长和事业发展的重要性。 【部分内容】中提到了阅读对作者个人生活和学习...
【知识点】 1. 日记写作:初中阶段的随笔日记是一种练习...以上内容涵盖了初中随笔日记中涉及到的多个知识要点,包括生活感悟、成长体验、学习策略以及情感表达等,这些对于初中生来说都是非常重要的学习和生活经验。
【标题】"散文随笔_生活三部曲散文随笔.rar"所指的是一份包含散文随笔作品的压缩文件,特别关注的是生活的主题。在IT领域,这可能涉及到电子书、数字出版或个人资料存储等方面的知识。"rar"是一种常见的文件压缩格式...
随笔作为一种灵活的文体,通常包含个人的情感体验、观察思考和感悟。在这篇文章中,作者提到了“一日为师,终身为父”的观念,强调了教师在传授知识和教导做人方面的关键作用。 文章中描述了不同科目的老师如何辛勤...
这篇文档主要讲述了作者在暑假期间学习陶艺的过程和感悟,以及对中学生活回忆的散文随笔。其中涉及的知识点如下: 1. **陶艺制作技术**:作者介绍了制作陶艺的基本步骤,包括使用泥条、泥板、机器等方法。例如,...
随笔通常是对教学实践的反思和感悟,是教师自我提升和教学经验分享的重要方式。这里的“中小学”意味着内容将涵盖小学到初中的语文教学,可能涉及不同年龄层次学生的特点和教学策略。 【描述分析】 描述与标题相同...