訪問量定時程式總結

2021-08-31 06:07:47 字數 1563 閱讀 2868

感謝噹噹,在跑寫這個程式的時候,噹噹讓我了解了很多新的知識

這是兩個比較經典的提問:

本程式要做的事情是:從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...