最近一直在和大数据打交道,今天看了会书,做个笔记。
1.访问全部数据时间过长
解决办法:循环读取部分数据,进行相应操作。
2.数据难以放入内存
解决办法:
①既然数据难以放入内存,那么我们就将数据存储到磁盘上面,循环地去读磁盘,这里要考虑IO复杂性,毕竟访问外存的效率要比访问内存的效率低。
②仅基于少数数据去进行计算。当然,这样得到的结果的准确率也会受到影响。
3.单个计算机难以保存全部数据,但是计算有需要整体的数据。
解决办法:这个时候就需要多台机器一起工作了,也就是所谓的并行处理。譬如mapReduce,hadoop,都是面向并行处理而提出的。
4.计算机计算能力不足或者知识不足
解决方法:计算机干不了,那当然就需要人来进行干涉了,也就是所谓的众包算法。
总结:对于第一点来说,它的数据量可能并不是很大,但是你拿到数据之后的逻辑操作这一个过程可能会比较长,整体处理的效率比较低。举个例子,如果如果我要一次性拿到两万条数据,去读这两万条数据进行操作,那么读数据库的耗时就不可小觑了,倘若在操作中又要多次操作数据库,那么时间消耗就很大了(这里要注意,对于操作数据库中的大数据量,我们要尽量地将自己的sql语句优化到最好,减少时间消耗)。对于这种情况,我们基本上都是建议将数据分批处理。因为有时候项目可能很急,如果大家都等着你将全部数据处理完,然后再进行下一步操作,那么这样的效率就很低。而我们往往都是要求将任务并行地进行,因此,大部分时候,最好的话,还是希望可以先得到部分数据,分批进行。如果中途停止了,那么我们也可以很好地将任务续上。
而对于第二点来说呢,数据的体量自然是大于第一点,因为你数据都放不进内存,更别说一次性处理整体的数据里。这个情况,最典型的就是我们经常说的topK的问题。这种问题的开头通常是:“我有一个T的数据,要找出里面的topK......”怎么做?一次性将数据读到内存里面?谁家内存这么大呀!显然是不可能呀,遇到这种情况,我们经常将数据分成很多小份,像分治法之类的。在上文中也提到了“仅及于少数数据去进行计算”,这里主要看需求上对准确率的要求如何了。很多时候,采样也是可以得到较为客观的结果的。
至于第三种,我暂时还没有相关经验,晚些时候再来总结。第四种,我们平常遇到很多,也就不提了。