簡單的文本操作和字節集操作,這種基本操作,在編程語言中作用非常大。
在日常工作中,可以幫助批處理很多數據。
一般的操作非常簡單,但是如果數據量巨大,就需要調整編程邏輯,才能做到高效處理。
做seo的人最常用到的,就是文本組合和文本去重復。在以百萬為單位的數據處理時,簡單的命令就無法勝任了。
對,不是效率慢,而是根本無法勝任。
比如,你用有三組關鍵詞,每組100個。將三組進行排列組合,那就100X100X100=1000000的數據。
用一般的組合命令,如果是兩組進行組合,那么可能速度還是可以接受的。但三組,就是指數級的遞增。
洪雨研究查閱很多資料,有說內存操作的,有說用數據庫操作的。
數據庫操作通常指的是mysql操,洪雨不太懂。內存操作的確是速度最快的。可惜這兩種方法洪雨都不太會,所以根本沒研究。最終選擇了快速文本對象和字節集操作。
快速文本對象,我也不知道什么原理,但是當數據量大的時候,就能看出比普通的文本操作速度確實快很多。
經過測試,1000000的數據用普通取文本操作,直接等到天荒地老。用快速文本對象用時70秒左右。
雖然勉強處理完畢,但是這種 速度還是讓人無法接受的。
洪雨后來也嘗試了字節集操作和快速快速字節集對象。速度確實又提高了一些,但是提高的非常有限。
如果百萬級別的數據組合速度無法控制在10秒以內,那么就沒有達到效果。
搞來搞去,找來找去,最終還是落在了多線程的頭上。
最終,通過多線程加快速文本對象,百萬的數據處理在5秒左右,不超過6秒。
為什么沒有用字節集呢,因為最終你還是要轉換成文本,這個轉換過程也是會耗費時間的。
說一下具體思路。
首先,將第一組關鍵詞和第二組關鍵詞進行組合。就是100X100=10000不需要什么方法,因為數據量小,直接數組疊加就行了。運行時間半秒鍾左右。
生成好的結果再和第三組進行組合。10000X100=1000000這個數據量就大了,我們通過多線程進行處理。
舉例,我們調用100個線程進行操作。那么第一步,我們通過分割這10000個結果關鍵詞,10000÷100=100。也就是一個線程處理100個關鍵詞和第三組的組合。
上面我們說了,100X100的處理速度不到半秒,也就是說,一個線程的處理時間不到半秒。100個線程同時處理,理論上說也不到半秒。最后將結果加起來。
通過實際測試,1000000數據的實際處理時間在5秒左右。
數據體積大概50M以上,如果你想顯示在軟件編輯框中,還需要10秒鍾時間加載。就算你寫到txt文檔中,打開時間也不短。
這中間還有一個問題。
就是,數據通常都不能被100整除。所以,正常的邏輯是,1.第一組和第二組進行組合,生成一個結果。2.將這個結果除以100取余數,先將余數進行組合處理。3.將剩下的除以100,進行分組多線程處理。
大概的速度,就是100萬5秒,200萬10秒這樣。
到此,問題基本解決。
可以參看一下,我之前記錄的單線程代碼。https://www.cnblogs.com/hongyuyingxiao/p/11628058.html
原文轉載自:http://www.zhizhuowz.com/post-676.html