感謝噹噹,在跑寫這個程式的時候,噹噹讓我了解了很多新的知識
這是兩個比較經典的提問:
本程式要做的事情是:從cache伺服器中讀取店鋪訪問量資料,然後入庫。
問題的難點 :
1 :全國所有店鋪的key(city_storeid)有750萬,資料量很大,導致跑的時候經常記憶體溢位
2 :解決了讀資料的問題,但是跑這麼多資料速度很慢,需要6個多小時,則思考了很多方法
問題一解決方式:
之前我是用buffedreaded類的readline方法一行一行的讀取,然後放在list裡面,在通過遍歷list去做更新操作。這明顯是不行的,把所有資料放在list導致記憶體溢位,放不了那麼多資料。
之後放棄這個方式,在buffedreaded類的readline方法讀取時就進行資料庫的入庫操作,因為readline方法每次讀取一定量的資料到記憶體,假設100條key,然後放到佇列裡,接著就一條一條的更新,所以不會導致記憶體溢位,但是出現乙個問題,就是跑的時間太慢
問題二解決方式:
想了很多方式:有想到用nio來提高io讀取的效率,也有想到用多執行緒,分割檔案來跑,最後還是用到了多執行緒,這個要感謝噹噹,有個例子給我,也讓我第一次接觸了多執行緒的current包(想當初就是沒有回答上這個包,才被**拒絕的)。剛開始進入了乙個誤區,還以為是讀取檔案慢了,結果是因為運算元據庫太慢了。mysql資料庫每秒可以接受500-1000的併發量,那麼750萬資料,怎麼算都至少跑2個小時(7500000/1000/3600)。所以只能通過加mysql資料庫集群才能使速度加快。
找個時間好好學習下current包
executorservice fixedpool =executors.newfixedthreadpool(poolsize);
還有用多執行緒跑的時候還出現了記憶體溢位的問題,問了噹噹之後,通過調整了eclipse的jvm虛擬機器的記憶體(從原來的252m調整到1g),還有就是把執行緒引用物件讀到佇列裡的時候,每50萬條,sleep(5000),不要一下子載入。
下面是**:
執行緒類**
//判斷靜態類是否有重複建立,可以用此來判斷
private static int count = 0;
private static score dianhitsscore;
private static istoreextservice storeextservice;
public threadforvisit(string data)
static
public void run() else
} else
count ++;
if(count % 10000 == 0)
} catch (exception e)
}main函式跑的**
executorservice fixedpool = executors.newfixedthreadpool(poolsize);
int count = 0;
if (data != null)
}} catch (exception e)
}其實裡面還設計到很多除錯**的技巧:分開測每個資料庫操作所需要的時間
Python 刷訪問量
ip通過 獲取,我使用的的是https 協議的 根據自己需求選擇http或者https 協議的頁面。廢話不多說,直接上 coding utf 8 from urllib import request import requests import random import time import r...
NGINX訪問量統計
1.根據訪問ip統計uv awk access.log sort uniq c wc l 2.統計訪問url統計pv awk access.log wc l 3.查詢訪問最頻繁的url awk access.log sort uniq c sort n k 1 r more 4.查詢訪問最頻繁的ip...
linux nginx訪問量統計
nginx訪問量統計 1.根據訪問ip統計uv awk access.log sort uniq c wc l 2.統計訪問url統計pv awk access.log wc l 3.查詢訪問最頻繁的url awk access.log sort uniq c sort n k 1 r more 4...