不重複大資料量的批量生成

2021-09-08 12:46:12 字數 1122 閱讀 7893

在工作中,同事遇到乙個需要批量生成不重複碼的功能,之前我處理的都是用php 直接用陣列 in_array解決的,那時候生成的數量倒還不多,大概也就幾萬個,所以直接將php的執行記憶體提高一點,然後就解決問題了。但是這次要處理的資料量比較大,是五千萬個,就容易出現問題。

首先,執行記憶體是肯定不夠的,然後儲存空間也會受到限制,**的效率在php超時的情況下會出現問題。30秒對於這樣的資料處理而言還是太短了,從生成情況來看,前面的生成比較快,後面的生成就逐漸的慢下來了,因為要保證和前面的不重複,如果不判斷是否重複,也是很快的。

我們的第一種方案是,先以100萬為批次的生成,然後匯入資料庫,在資料庫的表中以該字段做主鍵,後來發現這樣的方式匯入比較慢,改為主鍵自增匯入,然後加快了速度,全部匯入後,採用group by 分組 查詢那些出現重複的,刪除掉,再補充相應數量的碼即可。

經前同事提醒,給我提供了第二種思路,採用redis的儲存比對來完成資料不重複的功能,在redis中有乙個雜湊的型別,不斷的將生成的碼放入該鍵中,使用 hset方法,這個方法會覆蓋或者新增某個鍵對應的值 我用的核心**如下

$result=$redis->hset("code_list",$code,$code);

這樣能根據生成的碼 本身做鍵,來儲存和替換,如果生成了重複了 就把之前的覆蓋掉了,這樣能正確的計算數量。然而在實際的redis操作過程發現,自己電腦記憶體不夠用,當生成三千三百萬資料的時候,輸入info檢視到memory的情況如下

很明顯已經達到了5.04g,我的電腦已經卡頓,打字和移動滑鼠逐漸變得困難,就沒有繼續實驗了。這個增長速度也是剛開始很快,後來逐漸的變慢了。然後增長的也越來越慢,而電腦也越來越卡,實驗終止了,我想如果以後有機會我還是會嘗試的,畢竟這個思路是很獨特,可以借鑑一下,但是這個本身是在nosql上面實驗,記憶體的耗費上容易出現問題。為什麼mysql沒有出現這樣的問題呢?因為mysql本身把資料儲存在物理磁碟上了,redis的資料還在記憶體中,這是不能比的。在本次試驗中,發現2千萬以前的資料還是比較好生成的,超過3千萬,就容易出問題,我電腦配置是

不重複大資料量的批量生成

在工作中,同事遇到乙個需要批量生成不重複碼的功能,之前我處理的都是用php 直接用陣列 in array解決的,那時候生成的數量倒還不多,大概也就幾萬個,所以直接將php的執行記憶體提高一點,然後就解決問題了。但是這次要處理的資料量比較大,是五千萬個,就容易出現問題。首先,執行記憶體是肯定不夠的,然...

求大資料量陣列中不重複元素的個數

有2.5億個整數 這2.5億個整數儲存在乙個陣列裡面,至於陣列是放在外存還是記憶體,沒有進一步具體說明 要求找出這2.5億個數字裡面,不重複的數字的個數 那些只出現一次的數字的數目 另外,可用的記憶體限定為600m 要求演算法盡量高效,最優 1.caoxic的演算法 byte marks 2 29 ...

大資料量演算法

給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 位圖思想解法 include stdio.h include stdlib.h include memory.h define max num 4294967295 int mai...