1. sql資料庫數據量龐大時怎麼處理。
1.表欄位類型、長度、默認值這些都要按實際情況去寫,不要瞎填;
2.能存英文就盡量不存中文,能存數字盡量不存英文;(資料庫查詢速度數字查詢速度最快,英文次之,中文最後)
3.索引要優化,按實際要求去創建索引,主鍵等;
4.sql語句要精簡,能不用*就盡量不用,想要什麼欄位查什麼欄位,不要怕多寫,盡量少用聯表查詢,多表查詢,尤其在大數據訪問的時候;
5.合理使用緩存技術,有模板緩存,資料庫查詢結果緩存。
2. 如何處理大數據查詢,將近1000萬的數據
不能只看數據量。還要考慮是否實時、這個查詢是否涉及分析、專門演算法、你現在版所會的技術。權
如果不考慮實時性,幾大關系資料庫也能滿足1000萬行的數據查詢。
如果涉及簡單的分析,又擅長python,可以用python的pandas輕松處理。
如果涉及演算法,又以後有很多個Tb,那長遠看,搭建個小型的hadoop也未嘗不可。
自己經驗,僅供參考。
3. 如何對百萬級的數據進行數據分析
1.可視化分析
大數據分析的使用者有大數據分析專家,同時還有普通用戶,但是他們二者對於大數據分析最基本的要求就是可視化分析,因為可視化分析能夠直觀的呈現大數據特點,同時能夠非常容易被讀者所接受,就如同看圖說話一樣簡單明了。
2. 數據挖掘演算法
大數據分析的理論核心就是數據挖掘演算法,各種數據挖掘的演算法基於不同的數據類型和格式才能更加科學的呈現出數據本身具備的特點,也正是因為這些被全世界統
計
學家所公認的各種統計方法(可以稱之為真理)才能深入數據內部,挖掘出公認的價值。另外一個方面也是因為有這些數據挖掘的演算法才能更快速的處理大數據,如
果一個演算法得花上好幾年才能得出結論,那大數據的價值也就無從說起了。
3. 預測性分析
大數據分析最終要的應用領域之一就是預測性分析,從大數據中挖掘出特點,通過科學的建立模型,之後便可以通過模型帶入新的數據,從而預測未來的數據。
4. 語義引擎
非結構化數據的多元化給數據分析帶來新的挑戰,我們需要一套工具系統的去分析,提煉數據。語義引擎需要設計到有足夠的人工智慧以足以從數據中主動地提取信息。
5.數據質量和數據管理。 大數據分析離不開數據質量和數據管理,高質量的數據和有效的數據管理,無論是在學術研究還是在商業應用領域,都能夠保證分析結果的真實和有價值。
大數據分析的基礎就是以上五個方面,當然更加深入大數據分析的話,還有很多很多更加有特點的、更加深入的、更加專業的大數據分析方法。
大數據的技術
數據採集: ETL工具負責將分布的、異構數據源中的數據如關系數據、平面數據文件等抽取到臨時中間層後進行清洗、轉換、集成,最後載入到數據倉庫或數據集市中,成為聯機分析處理、數據挖掘的基礎。
數據存取: 關系資料庫、NOSQL、SQL等。
基礎架構: 雲存儲、分布式文件存儲等。
數
據處理: 自然語言處理(NLP,Natural Language
Processing)是研究人與計算機交互的語言問題的一門學科。處理自然語言的關鍵是要讓計算機」理解」自然語言,所以自然語言處理又叫做自然語言理
解也稱為計算語言學。一方面它是語言信息處理的一個分支,另一方面它是人工智慧的核心課題之一。
統計分析:
假設檢驗、顯著性檢驗、差異分析、相關分析、T檢驗、 方差分析 、
卡方分析、偏相關分析、距離分析、回歸分析、簡單回歸分析、多元回歸分析、逐步回歸、回歸預測與殘差分析、嶺回歸、logistic回歸分析、曲線估計、
因子分析、聚類分析、主成分分析、因子分析、快速聚類法與聚類法、判別分析、對應分析、多元對應分析(最優尺度分析)、bootstrap技術等等。
數
據挖掘: 分類
(Classification)、估計(Estimation)、預測(Prediction)、相關性分組或關聯規則(Affinity
grouping or association rules)、聚類(Clustering)、描述和可視化、Description and
Visualization)、復雜數據類型挖掘(Text, Web ,圖形圖像,視頻,音頻等)
模型預測 :預測模型、機器學習、建模模擬。
結果呈現: 雲計算、標簽雲、關系圖等。
大數據的處理
1. 大數據處理之一:採集
大
數據的採集是指利用多個資料庫來接收發自客戶端(Web、App或者感測器形式等)的
數據,並且用戶可以通過這些資料庫來進行簡單的查詢和處理工作。比如,電商會使用傳統的關系型資料庫MySQL和Oracle等來存儲每一筆事務數據,除
此之外,Redis和MongoDB這樣的NoSQL資料庫也常用於數據的採集。
在大數據的採集過程中,其主要特點和挑戰是並發數高,因為同時
有可能會有成千上萬的用戶
來進行訪問和操作,比如火車票售票網站和淘寶,它們並發的訪問量在峰值時達到上百萬,所以需要在採集端部署大量資料庫才能支撐。並且如何在這些資料庫之間
進行負載均衡和分片的確是需要深入的思考和設計。
2. 大數據處理之二:導入/預處理
雖然採集端本身會有很多資料庫,但是如果要對這些
海量數據進行有效的分析,還是應該將這
些來自前端的數據導入到一個集中的大型分布式資料庫,或者分布式存儲集群,並且可以在導入基礎上做一些簡單的清洗和預處理工作。也有一些用戶會在導入時使
用來自Twitter的Storm來對數據進行流式計算,來滿足部分業務的實時計算需求。
導入與預處理過程的特點和挑戰主要是導入的數據量大,每秒鍾的導入量經常會達到百兆,甚至千兆級別。
3. 大數據處理之三:統計/分析
統
計與分析主要利用分布式資料庫,或者分布式計算集群來對存儲於其內的海量數據進行普通
的分析和分類匯總等,以滿足大多數常見的分析需求,在這方面,一些實時性需求會用到EMC的GreenPlum、Oracle的Exadata,以及基於
MySQL的列式存儲Infobright等,而一些批處理,或者基於半結構化數據的需求可以使用Hadoop。
統計與分析這部分的主要特點和挑戰是分析涉及的數據量大,其對系統資源,特別是I/O會有極大的佔用。
4. 大數據處理之四:挖掘
與
前面統計和分析過程不同的是,數據挖掘一般沒有什麼預先設定好的主題,主要是在現有數
據上面進行基於各種演算法的計算,從而起到預測(Predict)的效果,從而實現一些高級別數據分析的需求。比較典型演算法有用於聚類的Kmeans、用於
統計學習的SVM和用於分類的NaiveBayes,主要使用的工具有Hadoop的Mahout等。該過程的特點和挑戰主要是用於挖掘的演算法很復雜,並
且計算涉及的數據量和計算量都很大,常用數據挖掘演算法都以單線程為主。
整個大數據處理的普遍流程至少應該滿足這四個方面的步驟,才能算得上是一個比較完整的大數據處理。
4. 資料庫有幾十萬條數據,求高手指點如何處理並發
如果有20萬條數據,5分鍾內處理完成,那麼每秒最少要處理600多條數據。你這個瓶頸在三個方面:
本地資料庫讀寫,你這個需要資料庫表不人導致死鎖的,這個可以通過堆硬體性能(IO和CPU主頻),資料庫做好對應的索引提升查詢速度,返回的結果先緩存到redis里,然後再寫回去,應該是可以解決的
提交速度,每秒提交600條,這個靠單線程是肯定解決不了的,這需要多任務多線程處理。。。最好的方式是第三方網站可以批量查詢
你以這么快的速度提交過去,第三方介面不一定能處理完成,可能有QPS限速的。這就不是你解決的了,需要第三方提升性能。
5. 請問一下大數據的數據處理包括什麼方面
大數據的數據處理一共包括四個方面分別是收集,存儲,變形,和分析。
收集:原始數據種類多樣,格式、位置、存儲、時效性等迥異。數據收集從異構數據源中收集數據並轉換成相應的格式方便處理。
存儲:收集好的數據需要根據成本、格式、查詢、業務邏輯等需求,存放在合適的存儲中,方便進一步的分析。
變形:原始數據需要變形與增強之後才適合分析,比如網頁日誌中把IP地址替換成省市、感測器數據的糾錯、用戶行為統計等。
分析:通過整理好的數據分析whathappened、whyithappened、whatishappening和whatwillhappen,幫助企業決策。
更多關於大數據的數據處理包括哪些方面,進入:https://m.abcgonglue.com/ask/49f18f1615839526.html?zd查看更多內容
6. mysql 數據量超過百萬後怎麼處理
1、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
2、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
3、應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
4、盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5、下面的查詢也將導致全表掃描:(不能前置百分號)
select id from t where name like 『�1�7c%』
若要提高效率,可以考慮全文檢索。
6、in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7、如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8、應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9、應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)=』abc』–name以abc開頭的id
select id from t where datediff(day,createdate,』2005-11-30′)=0–』2005-11-30′生成的id
應改為:
select id from t where name like 『abc%』
select id from t where createdate>=』2005-11-30′ and createdate<』2005-12-1′
10、不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11、在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使 用,並且應盡可能的讓欄位順序與索引順序相一致。
12、不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(…)
13、很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14、並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位 sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15、索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。
16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。
17、盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會 逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
18、盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。
19、任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。
20、盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。
21、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
22、臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使 用導出表。
23、在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。
24、如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
25、盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。
26、使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
27、與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時 間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
28、在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。
29、盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
30、盡量避免大事務操作,提高系統並發能力。
7. php 處理上百萬條的資料庫如何提高處理查詢速度
1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
若要提高效率,可以考慮全文檢索。
7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變數,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num
8.應盡量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
9.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--『2005-11-30'生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
11.在使用索引欄位作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)
13.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14.並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那麼需要考慮是否應將該索引建為 clustered 索引。
17.盡量使用數字型欄位,若只含數值信息的欄位盡量不要設計為字元型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的欄位內搜索效率顯然要高些。
19.任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。
20.盡量使用表變數來代替臨時表。如果表變數包含大量數據,請注意索引非常有限(只有主鍵索引)。
21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
22.臨時表並不是不可使用,適當地使用它們可以使某些常式更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。
23.在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然後insert。
24.如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該考慮改寫。
26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
27.與臨時表一樣,游標並不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括「合計」的常式通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句後向客戶端發送 DONE_IN_PROC 消息。
29.盡量避免大事務操作,提高系統並發能力。
30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
8. 如何處理海量數據
在實際的工作環境下,許多人會遇到海量數據這個復雜而艱巨的問題,它的主要難點有以下幾個方面:
一、數據量過大,數據中什麼情況都可能存在。
如果說有10條數據,那麼大不了每條去逐一檢查,人為處理,如果有上百條數據,也可以考慮,如果數據上到千萬級別,甚至 過億,那不是手工能解決的了,必須通過工具或者程序進行處理,尤其海量的數據中,什麼情況都可能存在,例如,數據中某處格式出了問題,尤其在程序處理時, 前面還能正常處理,突然到了某個地方問題出現了,程序終止了。
二、軟硬體要求高,系統資源佔用率高。
對海量的數據進行處理,除了好的方法,最重要的就是合理使用工具,合理分配系統資源。一般情況,如果處理的數據過TB級,小型機是要考慮的,普通的機子如果有好的方法可以考慮,不過也必須加大CPU和內存,就象面對著千軍萬馬,光有勇氣沒有一兵一卒是很難取勝的。
三、要求很高的處理方法和技巧。
這也是本文的寫作目的所在,好的處理方法是一位工程師長期工作經驗的積累,也是個人的經驗的總結。沒有通用的處理方法,但有通用的原理和規則。
下面我們來詳細介紹一下處理海量數據的經驗和技巧:
一、選用優秀的資料庫工具
現在的資料庫工具廠家比較多,對海量數據的處理對所使用的資料庫工具要求比較高,一般使用Oracle或者DB2,微軟 公司最近發布的SQL Server 2005性能也不錯。另外在BI領域:資料庫,數據倉庫,多維資料庫,數據挖掘等相關工具也要進行選擇,象好的ETL工具和好的OLAP工具都十分必要, 例如Informatic,Eassbase等。筆者在實際數據分析項目中,對每天6000萬條的日誌數據進行處理,使用SQL Server 2000需要花費6小時,而使用SQL Server 2005則只需要花費3小時。
二、編寫優良的程序代碼
處理數據離不開優秀的程序代碼,尤其在進行復雜數據處理時,必須使用程序。好的程序代碼對數據的處理至關重要,這不僅僅是數據處理准確度的問題,更是數據處理效率的問題。良好的程序代碼應該包含好的演算法,包含好的處理流程,包含好的效率,包含好的異常處理機制等。
三、對海量數據進行分區操作
對海量數據進行分區操作十分必要,例如針對按年份存取的數據,我們可以按年進行分區,不同的資料庫有不同的分區方式,不 過處理機制大體相同。例如SQL Server的資料庫分區是將不同的數據存於不同的文件組下,而不同的文件組存於不同的磁碟分區下,這樣將數據分散開,減小磁碟I/O,減小了系統負荷, 而且還可以將日誌,索引等放於不同的分區下。
四、建立廣泛的索引
對海量的數據處理,對大表建立索引是必行的,建立索引要考慮到具體情況,例如針對大表的分組、排序等欄位,都要建立相應 索引,一般還可以建立復合索引,對經常插入的表則建立索引時要小心,筆者在處理數據時,曾經在一個ETL流程中,當插入表時,首先刪除索引,然後插入完 畢,建立索引,並實施聚合操作,聚合完成後,再次插入前還是刪除索引,所以索引要用到好的時機,索引的填充因子和聚集、非聚集索引都要考慮。
五、建立緩存機制
當數據量增加時,一般的處理工具都要考慮到緩存問題。緩存大小設置的好差也關繫到數據處理的成敗,例如,筆者在處理2億條數據聚合操作時,緩存設置為100000條/Buffer,這對於這個級別的數據量是可行的。
六、加大虛擬內存
如果系統資源有限,內存提示不足,則可以靠增加虛擬內存來解決。筆者在實際項目中曾經遇到針對18億條的數據進行處理, 內存為1GB,1個P42.4G的CPU,對這么大的數據量進行聚合操作是有問題的,提示內存不足,那麼採用了加大虛擬內存的方法來解決,在6塊磁碟分區 上分別建立了6個4096M的磁碟分區,用於虛擬內存,這樣虛擬的內存則增加為 4096*6 + 1024 =25600 M,解決了數據處理中的內存不足問題。
七、分批處理
海量數據處理難因為數據量大,那麼解決海量數據處理難的問題其中一個技巧是減少數據量。可以對海量數據分批處理,然後處 理後的數據再進行合並操作,這樣逐個擊破,有利於小數據量的處理,不至於面對大數據量帶來的問題,不過這種方法也要因時因勢進行,如果不允許拆分數據,還 需要另想辦法。不過一般的數據按天、按月、按年等存儲的,都可以採用先分後合的方法,對數據進行分開處理。
八、使用臨時表和中間表
數據量增加時,處理中要考慮提前匯總。這樣做的目的是化整為零,大表變小表,分塊處理完成後,再利用一定的規則進行合 並,處理過程中的臨時表的使用和中間結果的保存都非常重要,如果對於超海量的數據,大表處理不了,只能拆分為多個小表。如果處理過程中需要多步匯總操作, 可按匯總步驟一步步來,不要一條語句完成,一口氣吃掉一個胖子。
九、優化查詢SQL語句
在對海量數據進行查詢處理過程中,查詢的SQL語句的性能對查詢效率的影響是非常大的,編寫高效優良的SQL腳本和存儲 過程是資料庫工作人員的職責,也是檢驗資料庫工作人員水平的一個標准,在對SQL語句的編寫過程中,例如減少關聯,少用或不用游標,設計好高效的資料庫表 結構等都十分必要。筆者在工作中試著對1億行的數據使用游標,運行3個小時沒有出結果,這是一定要改用程序處理了。
十、使用文本格式進行處理
對一般的數據處理可以使用資料庫,如果對復雜的數據處理,必須藉助程序,那麼在程序操作資料庫和程序操作文本之間選擇, 是一定要選擇程序操作文本的,原因為:程序操作文本速度快;對文本進行處理不容易出錯;文本的存儲不受限制等。例如一般的海量的網路日誌都是文本格式或者 csv格式(文本格式),對它進行處理牽扯到數據清洗,是要利用程序進行處理的,而不建議導入資料庫再做清洗。
十一、定製強大的清洗規則和出錯處理機制
海量數據中存在著不一致性,極有可能出現某處的瑕疵。例如,同樣的數據中的時間欄位,有的可能為非標準的時間,出現的原因可能為應用程序的錯誤,系統的錯誤等,這是在進行數據處理時,必須制定強大的數據清洗規則和出錯處理機制。
十二、建立視圖或者物化視圖
視圖中的數據來源於基表,對海量數據的處理,可以將數據按一定的規則分散到各個基表中,查詢或處理過程中可以基於視圖進行,這樣分散了磁碟I/O,正如10根繩子吊著一根柱子和一根吊著一根柱子的區別。
十三、避免使用32位機子(極端情況)
目前的計算機很多都是32位的,那麼編寫的程序對內存的需要便受限制,而很多的海量數據處理是必須大量消耗內存的,這便要求更好性能的機子,其中對位數的限制也十分重要。
十四、考慮操作系統問題
海量數據處理過程中,除了對資料庫,處理程序等要求比較高以外,對操作系統的要求也放到了重要的位置,一般是必須使用伺服器的,而且對系統的安全性和穩定性等要求也比較高。尤其對操作系統自身的緩存機制,臨時空間的處理等問題都需要綜合考慮。
十五、使用數據倉庫和多維資料庫存儲
數據量加大是一定要考慮OLAP的,傳統的報表可能5、6個小時出來結果,而基於Cube的查詢可能只需要幾分鍾,因此處理海量數據的利器是OLAP多維分析,即建立數據倉庫,建立多維數據集,基於多維數據集進行報表展現和數據挖掘等。
十六、使用采樣數據,進行數據挖掘
基於海量數據的數據挖掘正在逐步興起,面對著超海量的數據,一般的挖掘軟體或演算法往往採用數據抽樣的方式進行處理,這樣 的誤差不會很高,大大提高了處理效率和處理的成功率。一般采樣時要注意數據的完整性和,防止過大的偏差。筆者曾經對1億2千萬行的表數據進行采樣,抽取出 400萬行,經測試軟體測試處理的誤差為千分之五,客戶可以接受。
還有一些方法,需要在不同的情況和場合下運用,例如使用代理鍵等操作,這樣的好處是加快了聚合時間,因為對數值型的聚合比對字元型的聚合快得多。類似的情況需要針對不同的需求進行處理。
海量數據是發展趨勢,對數據分析和挖掘也越來越重要,從海量數據中提取有用信息重要而緊迫,這便要求處理要准確,精度要高,而且處理時間要短,得到有價值信息要快,所以,對海量數據的研究很有前途,也很值得進行廣泛深入的研究。