不重复大数据量的批量生成
2017-05-02 20:59
190 查看
在工作中,同事遇到一个需要批量生成不重复码的功能,之前我处理的都是用php 直接用数组 in_array解决的,那时候生成的数量倒还不多,大概也就几万个,所以直接将php的运行内存提高一点,然后就解决问题了。但是这次要处理的数据量比较大,是五千万个,就容易出现问题。
首先,运行内存是肯定不够的,然后存储空间也会受到限制,代码的效率在php超时的情况下会出现问题。30秒对于这样的数据处理而言还是太短了,从生成情况来看,前面的生成比较快,后面的生成就逐渐的慢下来了,因为要保证和前面的不重复,如果不判断是否重复,也是很快的。
我们的第一种方案是,先以100万为批次的生成,然后导入数据库,在数据库的表中以该字段做主键,后来发现这样的方式导入比较慢,改为主键自增导入,然后加快了速度,全部导入后,采用group by 分组 查询那些出现重复的,删除掉,再补充相应数量的码即可。
经前同事提醒,给我提供了第二种思路,采用redis的存储比对来完成数据不重复的功能,在redis中有一个哈希的类型,不断的将生成的码放入该键中,使用 hset方法,这个方法会覆盖或者新增某个键对应的值 我用的核心代码如下
$result=$redis->hset("code_list",$code,$code);
这样能根据生成的码 本身做键,来存储和替换,如果生成了重复了 就把之前的覆盖掉了,这样能正确的计算数量。然而在实际的redis操作过程发现,自己电脑内存不够用,当生成三千三百万数据的时候,输入info查看到memory的情况如下
![](https://images2015.cnblogs.com/blog/704203/201705/704203-20170502204841398-1737096967.png)
很明显已经达到了5.4G,我的电脑已经卡顿,打字和移动鼠标逐渐变得困难,就没有继续实验了。这个增长速度也是刚开始很快,后来逐渐的变慢了。然后增长的也越来越慢,而电脑也越来越卡,实验终止了,我想如果以后有机会我还是会尝试的,毕竟这个思路是很独特,可以借鉴一下,但是这个本身是在NOSQL上面实验,内存的耗费上容易出现问题。为什么mysql没有出现这样的问题呢?因为mysql本身把数据存储在物理磁盘上了,redis的数据还在内存中,这是不能比的。在本次试验中,发现2千万以前的数据还是比较好生成的,超过3千万,就容易出问题,我电脑配置是
首先,运行内存是肯定不够的,然后存储空间也会受到限制,代码的效率在php超时的情况下会出现问题。30秒对于这样的数据处理而言还是太短了,从生成情况来看,前面的生成比较快,后面的生成就逐渐的慢下来了,因为要保证和前面的不重复,如果不判断是否重复,也是很快的。
我们的第一种方案是,先以100万为批次的生成,然后导入数据库,在数据库的表中以该字段做主键,后来发现这样的方式导入比较慢,改为主键自增导入,然后加快了速度,全部导入后,采用group by 分组 查询那些出现重复的,删除掉,再补充相应数量的码即可。
经前同事提醒,给我提供了第二种思路,采用redis的存储比对来完成数据不重复的功能,在redis中有一个哈希的类型,不断的将生成的码放入该键中,使用 hset方法,这个方法会覆盖或者新增某个键对应的值 我用的核心代码如下
$result=$redis->hset("code_list",$code,$code);
这样能根据生成的码 本身做键,来存储和替换,如果生成了重复了 就把之前的覆盖掉了,这样能正确的计算数量。然而在实际的redis操作过程发现,自己电脑内存不够用,当生成三千三百万数据的时候,输入info查看到memory的情况如下
![](https://images2015.cnblogs.com/blog/704203/201705/704203-20170502204841398-1737096967.png)
很明显已经达到了5.4G,我的电脑已经卡顿,打字和移动鼠标逐渐变得困难,就没有继续实验了。这个增长速度也是刚开始很快,后来逐渐的变慢了。然后增长的也越来越慢,而电脑也越来越卡,实验终止了,我想如果以后有机会我还是会尝试的,毕竟这个思路是很独特,可以借鉴一下,但是这个本身是在NOSQL上面实验,内存的耗费上容易出现问题。为什么mysql没有出现这样的问题呢?因为mysql本身把数据存储在物理磁盘上了,redis的数据还在内存中,这是不能比的。在本次试验中,发现2千万以前的数据还是比较好生成的,超过3千万,就容易出问题,我电脑配置是
![](https://images2015.cnblogs.com/blog/704203/201705/704203-20170502205834101-417570142.png)
相关文章推荐
- 在数据库批量生成不重复有序订单号
- 已解决:mysql 批量插入生成UUID重复问题
- php编写批量生成不重复的卡号密码代码
- 批量生成不重复的虚拟卡卡号和密码
- PS如何批量生成缩略图(方法可以通用其他重复劳动)
- PHP如何批量生成手机号-使用PHP 如何生成一组不重复的手机号码?
- php编写批量生成不重复的卡号密码代码
- 批量生成有规律 不重复 长度一致的会员卡号
- C# 同一时间批量生成订单号不重复
- Windows 下批量生成 SWF 缩略图的快速解决方案
- JAVA 生成无重复8位随机码(转)
- 一个文件重复生成的小工具[附源码和可执行文件]
- 根据时间随机生成12位数字,且不重复2015-8-21
- Java生成随机不重复邀请码(数字+字母)
- 不重复随即生成数字和排序
- 生成不重复的随机码
- c 生成随机不重复的整数序列
- 不重复随机生成数
- mysql妙用:批量插入记录,遇到重复记录则为自动更新