導航:首頁 > 網路數據 > 大數據小內存排序

大數據小內存排序

發布時間:2022-11-26 11:02:04

A. excel大數據排序問題

樓主還是將需求進一步明確下吧
大數據是什麼情況
排序的話,可以使用Excel自帶的排序功能
如果有問題,該結合附件內容舉例說明吧

B. 資料庫中排序的對比及使用條件詳解

假定MySQL伺服器和PHP伺服器都已經按照最適合的方式來配置,那麼系統的可伸縮性(Scalability)和用戶感知性能(User-perceived
Performance)是我們追求的主要目標。在實際運行中,MYSQL
中數據往往以
HASH
tables、BTREE
等方式存貯於內存,操作速度很快;同時INDEX
已經進行了一些預排序;很多應用中,MySQL
排序是首選。
PHP與MySQL相比具有如下優勢:
1、考慮整個網站的可伸縮性和整體性能,在應用層(PHP)中排序明顯會降低資料庫的負載,從而提升整個網站的擴展能力。而資料庫的排序,實際上成本是非常高的,消耗內存、CPU,如果並發的排序很多,DB
很容易到瓶頸。
2、如果在應用層(PHP)和MYSQL之間還存在數據中間層,合理利用,PHP會有更好的收益。
3、PHP在內存中的數據結構專門針對具體應用來設計,比資料庫更為簡潔、高效;
4、PHP不用考慮數據災難恢復問題,可以減少這部分的操作損耗;
5、PHP不存在表的鎖定問題;
6、MySQL中排序,請求和結果返回還需要通過網路連接來進行,而PHP中排序之後就可以直接返回了,減少了網路IO。
至於執行速度,差異應該不會很大,除非應用設計有問題,造成大量不必要的網路IO。另外,應用層要注意PHP

Cache
設置,如果超出會報告內部錯誤;此時要根據應用做好評估,或者調整Cache。具體選擇,將取決於具體的應用。
列出一些PHP中執行排序更優的情況:
1、數據源不在MySQL
中,存在硬碟、內存或者來自網路的請求等;
2、數據存在
MySQL
中,量不大,而且沒有相應的索引,此時把數據取出來用PHP排序更快;
3、數據源來自於多個MySQL
伺服器,此時從多個
MySQL
中取出數據,然後在PHP中排序更快;
4、除了MySQL
之外,存在其他數據源,比如硬碟、內存或者來自網路的請求等,此時不適合把這些數據存入MySQL
後再排序;
列出一些必須在MySQL中排序的實例:
1、MySQL中已經存在這個排序的索引;
2、MySQL中數據量較大,而結果集需要其中很小的一個子集;比如
1000000
行數據,取TOP
10;
3、對於一次排序、多次調用的情況,比如統計聚合的情形,可以提供給不同的服務使用,那麼在MySQL
中排序是首選的。另外,對於數據深度挖掘,通常做法是在應用層做完排序等復雜操作,把結果存入MySQL即可,便於多次使用。
4、不論數據源來自哪裡,當數據量大到一定的規模後,由於佔用內存/Cache
的關系,不再適合PHP中排序了;此時把數據復制、導入或者存在MySQL
,並用INDEX
優化,是優於PHP
的。不過,用
java,甚至
C++
來處理這類操作會更好。
有些類似大數據集聚合或者匯總的數據,在客戶端排序得不償失。當然,也有用類似搜索引擎的思路來解決類似應用的情況。
從網站整體考慮,就必須加入人力和成本的考慮。假如網站規模和負載較小,而人力有限(人數和能力都可能有限),此時在應用層(PHP)做排序要做不少開發和調試工作,耗費時間,得不償失;不如在DB
中處理,簡單快速。對於大規模的網站,電力、伺服器的費用很高,在系統架構上精打細算,可以節約大量的費用,是公司持續發展之必要;此時如果能在應用層(PHP)
進行排序並滿足業務需求,盡量在應用層進行。
關於PHP中執行排序與MySQL中執行排序的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

C. 大數據最常用的演算法有哪些

奧地利符號計算研究所(Research Institute for Symbolic Computation,簡稱RISC)的Christoph Koutschan博士在自己的頁面上發布了一篇文章,提到他做了一個調查,參與者大多數是計算機科學家,他請這些科學家投票選出最重要的演算法,以下是這次調查的結果,按照英文名稱字母順序排序。

大數據等最核心的關鍵技術:32個演算法

1、A* 搜索演算法——圖形搜索演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,A*搜索演算法是最佳優先搜索的範例。

2、集束搜索(又名定向搜索,Beam Search)——最佳優先搜索演算法的優化。使用啟發式函數評估它檢查的每個節點的能力。不過,集束搜索只能在每個深度中發現最前面的m個最符合條件的節點,m是固定數字——集束的寬度。

3、二分查找(Binary Search)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。

4、分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。

5、Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。

6、數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。

7、Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。

8、Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。

9、離散微分演算法(Discrete differentiation)。

10、動態規劃演算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構演算法

11、歐幾里得演算法(Euclidean algorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。

12、期望-最大演算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值。

13、快速傅里葉變換(Fast Fourier transform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。該演算法應用范圍很廣,從數字信號處理到解決偏微分方程,到快速計算大整數乘積。

14、梯度下降(Gradient descent)——一種數學上的最優化演算法。

15、哈希演算法(Hashing)。

16、堆排序(Heaps)。

17、Karatsuba乘法——需要完成上千位整數的乘法的系統中使用,比如計算機代數系統和大數程序庫,如果使用長乘法,速度太慢。該演算法發現於1962年。

18、LLL演算法(Lenstra-Lenstra-Lovasz lattice rection)——以格規約(lattice)基數為輸入,輸出短正交向量基數。LLL演算法在以下公共密鑰加密方法中有大量使用:背包加密系統(knapsack)、有特定設置的RSA加密等等。

19、最大流量演算法(Maximum flow)——該演算法試圖從一個流量網路中找到最大的流。它優勢被定義為找到這樣一個流的值。最大流問題可以看作更復雜的網路流問題的特定情況。最大流與網路中的界面有關,這就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一個流網路中的最大流。

20、合並排序(Merge Sort)。

21、牛頓法(Newton』s method)——求非線性方程(組)零點的一種重要的迭代法。

22、Q-learning學習演算法——這是一種通過學習動作值函數(action-value function)完成的強化學習演算法,函數採取在給定狀態的給定動作,並計算出期望的效用價值,在此後遵循固定的策略。Q-leanring的優勢是,在不需要環境模型的情況下,可以對比可採納行動的期望效用。

23、兩次篩法(Quadratic Sieve)——現代整數因子分解演算法,在實踐中,是目前已知第二快的此類演算法(僅次於數域篩法Number Field Sieve)。對於110位以下的十位整數,它仍是最快的,而且都認為它比數域篩法更簡單。

24、RANSAC——是「RANdom SAmple Consensus」的縮寫。該演算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。其基本假設是:數據包含非異化值,也就是能夠通過某些模型參數解釋的值,異化值就是那些不符合模型的數據點。

25、RSA——公鑰加密演算法。首個適用於以簽名作為加密的演算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。

26、Sch?nhage-Strassen演算法——在數學中,Sch?nhage-Strassen演算法是用來完成大整數的乘法的快速漸近演算法。其演算法復雜度為:O(N log(N) log(log(N))),該演算法使用了傅里葉變換。

27、單純型演算法(Simplex Algorithm)——在數學的優化理論中,單純型演算法是常用的技術,用來找到線性規劃問題的數值解。線性規劃問題包括在一組實變數上的一系列線性不等式組,以及一個等待最大化(或最小化)的固定線性函數。

28、奇異值分解(Singular value decomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdetermined linear systems)、矩陣逼近、數值天氣預報等等。

29、求解線性方程組(Solving a system of linear equations)——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordan elimination),或是柯列斯基分解( Cholesky decomposition)。

30、Strukturtensor演算法——應用於模式識別領域,為所有像素找出一種計算方法,看看該像素是否處於同質區域( homogenous region),看看它是否屬於邊緣,還是是一個頂點。

31、合並查找演算法(Union-find)——給定一組元素,該演算法常常用來把這些元素分為多個分離的、彼此不重合的組。不相交集(disjoint-set)的數據結構可以跟蹤這樣的切分方法。合並查找演算法可以在此種數據結構上完成兩個有用的操作:

查找:判斷某特定元素屬於哪個組。

合並:聯合或合並兩個組為一個組。

32、維特比演算法(Viterbi algorithm)——尋找隱藏狀態最有可能序列的動態規劃演算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。

以上就是Christoph博士對於最重要的演算法的調查結果。你們熟悉哪些演算法?又有哪些演算法是你們經常使用的?

D. 演算法:小數據量用冒泡,大數據量用快排,關於這里的數據量判斷問題

left + CUTOFF > right
是說如果left和right之間個數少於CUTOFF的時候用冒泡,多於用快排
left + CUTOFF如果大於了right說明left和right的差值小於CUTOFF
好好理解下吧寫成這樣可能好理解點,實際是等效的
if(right - left < CUTOFF)

E. 海量數據分析處理方法

海量數據分析處理方法
一、Bloom filter
適用范圍:可以用來實現數據字典,進行數據的判重,或者集合求交集
基本原理及要點:
對於原理來說很簡單,位數組+k個獨立hash函數。將hash函數對應的值的位數組置1,查找時如果發現所有hash函數對應位都是1說明存在,很明顯這個過程並不保證查找的結果是100%正確的。同時也不支持刪除一個已經插入的關鍵字,因為該關鍵字對應的位會牽動到其他的關鍵字。所以一個簡單的改進就是 counting Bloom filter,用一個counter數組代替位數組,就可以支持刪除了。
還有一個比較重要的問題,如何根據輸入元素個數n,確定位數組m的大小及hash函數個數。當hash函數個數k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大於E的情況下,m至少要等於n*lg(1/E)才能表示任意n個元素的集合。但m還應該更大些,因為還要保證bit數組里至少一半為0,則m應該>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2為底的對數)。
舉個例子我們假設錯誤率為0.01,則此時m應大概是n的13倍。這樣k大概是8個。
注意這里m與n的單位不同,m是bit為單位,而n則是以元素個數為單位(准確的說是不同元素的個數)。通常單個元素的長度都是有很多bit的。所以使用bloom filter內存上通常都是節省的。
擴展:
Bloom filter將集合中的元素映射到位數組中,用k(k為哈希函數個數)個映射位是否全1表示元素在不在這個集合中。Counting bloom filter(CBF)將位數組中的每一位擴展為一個counter,從而支持了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現次數關聯。SBF採用counter中的最小值來近似表示元素的出現頻率。
問題實例:給你A,B兩個文件,各存放50億條URL,每條URL佔用64位元組,內存限制是4G,讓你找出A,B文件共同的URL。如果是三個乃至n個文件呢?
根據這個問題我們來計算下內存的佔用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。現在可用的是340億,相差並不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。
二、Hashing
適用范圍:快速查找,刪除的基本數據結構,通常需要總數據量可以放入內存
基本原理及要點:
hash函數選擇,針對字元串,整數,排列,具體相應的hash方法。
碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。
擴展:
d-left hashing中的d是多個的意思,我們先簡化這個問題,看一看2-left hashing。2-left hashing指的是將一個哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個哈希函數,h1和h2。在存儲一個新的key時,同時用兩個哈希函數進行計算,得出兩個地址h1[key]和h2[key]。這時需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個位置已經存儲的(有碰撞的)key比較多,然後將新key存儲在負載少的位置。如果兩邊一樣多,比如兩個位置都為空或者都存儲了一個key,就把新key存儲在左邊的T1子表中,2-left也由此而來。在查找一個key時,必須進行兩次hash,同時查找兩個位置。
問題實例:
1).海量日誌數據,提取出某日訪問網路次數最多的那個IP。
IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然後進行統計。
三、bit-map
適用范圍:可進行數據的快速查找,判重,刪除,一般來說數據范圍是int的10倍以下
基本原理及要點:使用bit數組來表示某些元素是否存在,比如8位電話號碼
擴展:bloom filter可以看做是對bit-map的擴展
問題實例:
1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的內存即可。
2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map。
四、堆
適用范圍:海量數據前n大,並且n比較小,堆可以放入內存
基本原理及要點:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆里的最大元素,如果它小於最大元素,則應該替換那個最大元素。這樣最後得到的n個元素就是最小的n個。適合大數據量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。
擴展:雙堆,一個最大堆與一個最小堆結合,可以用來維護中位數。
問題實例:
1)100w個數中找最大的前100個數。
用一個100個元素大小的最小堆即可。
五、雙層桶劃分-—其實本質上就是【分而治之】的思想,重在分的技巧上!
適用范圍:第k大,中位數,不重復或重復的數字
基本原理及要點:因為元素范圍很大,不能利用直接定址表,所以通過多次劃分,逐步確定范圍,然後最後在一個可以接受的范圍內進行。可以通過多次縮小,雙層只是一個例子。
擴展:
問題實例:
1).2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個文件代表一個區域),然後將數據分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
2).5億個int找它們的中位數。
這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然後讀取數據統計落到各個區域里的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃描我們只統計落在這個區域中的那些數就可以了。
實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然後確定區域的第幾大數,在將該區域分成2^20個子區域,然後確定是子區域的第幾大數,然後子區域里的數的個數只有2^20,就可以直接利用direct addr table進行統計了。
六、資料庫索引
適用范圍:大數據量的增刪改查
基本原理及要點:利用數據的設計實現方法,對海量數據的增刪改查進行處理。
七、倒排索引(Inverted index)
適用范圍:搜索引擎,關鍵字查詢
基本原理及要點:為何叫倒排索引?一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
以英文為例,下面是要被索引的文本: T0 = 「it is what it is」 T1 = 「what is it」 T2 = 「it is a banana」
我們就能得到下面的反向文件索引:
「a」: {2} 「banana」: {2} 「is」: {0, 1, 2} 「it」: {0, 1, 2} 「what」: {0, 1}
檢索的條件」what」,」is」和」it」將對應集合的交集。
正向索引開發出來用來存儲每個文檔的單詞的列表。正向索引的查詢往往滿足每個文檔有序頻繁的全文查詢和每個單詞在校驗文檔中的驗證這樣的查詢。在正向索引中,文檔占據了中心的位置,每個文檔指向了一個它所包含的索引項的序列。也就是說文檔指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文檔,很容易看到這個反向的關系。
擴展:
問題實例:文檔檢索系統,查詢那些文件包含了某單詞,比如常見的學術論文的關鍵字搜索。
八、外排序
適用范圍:大數據的排序,去重
基本原理及要點:外排序的歸並方法,置換選擇敗者樹原理,最優歸並樹
擴展:
問題實例:
1).有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16個位元組,內存限制大小是1M。返回頻數最高的100個詞。
這個數據具有很明顯的特點,詞的大小為16個位元組,但是內存只有1m做hash有些不夠,所以可以用來排序。內存可以當輸入緩沖區使用。
九、trie樹
適用范圍:數據量大,重復多,但是數據種類小可以放入內存
基本原理及要點:實現方式,節點孩子的表示方式
擴展:壓縮實現。
問題實例:
1).有10個文件,每個文件1G,每個文件的每一行都存放的是用戶的query,每個文件的query都可能重復。要你按照query的頻度排序。
2).1000萬字元串,其中有些是相同的(重復),需要把重復的全部去掉,保留沒有重復的字元串。請問怎麼設計和實現?
3).尋找熱門查詢:查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復後,不超過3百萬個,每個不超過255位元組。
十、分布式處理 maprece
適用范圍:數據量大,但是數據種類小可以放入內存
基本原理及要點:將數據交給不同的機器去處理,數據劃分,結果歸約。
擴展:
問題實例:
1).The canonical example application of MapRece is a process to count the appearances ofeach different word in a set of documents:
2).海量數據分布在100台電腦中,想個辦法高效統計出這批數據的TOP10。
3).一共有N個機器,每個機器上有N個數。每個機器最多存O(N)個數並對它們操作。如何找到N^2個數的中數(median)?

F. 大數據量實時統計排序分頁查詢 優化總結

大數據量實時統計排序分頁查詢 (並發數較小時) 的瓶頸不是函數(count,sum等)執行,

不是having, 也不是order by,甚至不是表join, 導致慢的原因就在於「數據量太大本身」

就是將表劃分為M份相互獨立的部分,可以是分表,也可以是不分表但冗餘一個取模結果欄位

實際結果是不分表比分表更加靈活,只需稍加配置,就可以動態切分大表,隨意更改M的大小。

將1條慢sql(大於30秒)拆分成為N條查詢速度巨快的sql(單條sql執行時間控制在20毫秒以內)

然後再web應用中以適當的線程數去並發查詢這些執行時間快的N條小sql再匯總結果

第一步查詢中去並發執行這N條小sql, 只取排序欄位和標識欄位,其他欄位一律丟棄

匯總結果後定位出當前頁面要顯示的pageNum條數據,再進行第二步查詢,取出頁面上需要展示的所有欄位

PS:這一點是至關重要的,其他幾點都可以不看,這點是最關鍵的。慢慢解釋一下:

a) 第一種方式是把資料庫中所有記錄(只取排序欄位和標識欄位並且不做任何sum,count having order by等操作)

全部拉到web應用中,在web應用中完成所有的計算

b) 第二種方式是把資料庫中所有記錄做sum count having等操作之後的所有行數拉到web應用中,在web應用中完成剩餘計算

c) 第三種方式是把資料庫中所有記錄做sum count having order by等操作之後把limit後的數據拉到web應用中,

在web應用中對limit後的數據再計算

顯然,第一種方式 資料庫什麼活都不做只取數據 是不可行的。以lg_order_count_seller為例,1500萬行,

如果只算id, seller_id和order_count 這三個bigint類型,至少需要拉8*3*1500 0000 = 360000000=340M,

拉到內存中之後存儲需要8*4*15000000= 460M,這還不算List是的2的n次方這個特點和計算排序等的內存開銷,

不僅資料庫與web應用機器IO扛不住,就是應用自身恐怕也要OOM了。

第二種方式,所有記錄做sum count having等操作之後,由於是group by seller_id的,總得數據量變為100萬(就是賣家總數),

這樣子一來,共需要拉8*3*100 0000 = 23M,拉到內存之後,需要8*4*100 0000 = 30M, 再算上List是的2的n次方這個特點和

計算排序等的內存開銷也不會超過100M, IO的時間和內存開銷勉強可以考慮接受。

第三種方式,所有記錄做sum count having order by等操作之後把limit後的數據拉到web應用中,因為做了limit,所以,

數據量很小了,無論是IO還是內存開銷都已經很小了。可以忽略。

綜合以上三種,第三種方式適用於頁面的前n頁和後n頁,因為這個limit的數據量隨著頁數的增大而增大,

當大到每個切分後的小表的數據量時就轉為第二種方式了。

第二種方式適用於頁面的第[n+1, totaoPageNum-n]頁。

切分成N條小sql後並行執行時排序不穩定性的解決辦法

① 問題描述:

優化之前,還是是一條大慢sql查詢時,由於資料庫排序是穩定排序,

所以當兩條記錄排序欄位值相同時他們在頁面上的頁碼位置是固定的。

優化之後,當並行執行這N條小sql時,由於無法控制這些小sql的先後執行順序,

導致在web應用中當兩條記錄的排序欄位值相同時在頁面上的頁碼位置是隨機的。

② 解決辦法:

除了拉標識欄位(seller_id)和排序欄位(order_count_sum)之外,再取一個unique(id)的欄位,當兩條記錄的排序欄位值相同時,再用這個unique的欄位(在賣家監控中這個欄位是id)進行第二次排序.這樣就解決了排序不穩定的問題。

③ 也許,看到這里會有疑問,為什麼不用seller_id?seller_id也是唯一, 這樣子不是少取id這個欄位,減少IO了?

seller_id雖然也是唯一,可以輔助排序,但是不要忘記資料庫的排序規則是:

如果兩列的值相等,那麼序號在前的排在前面,這里的序號就是主鍵(自動生成,autoincrement),

如果用seller_id的話還是不能保證排序的穩定性,只能用主鍵id.

優先載入頁面上的主要元素,然後再去非同步載入次要元素,

反應在賣家監控頁面中,查數據和查頁頁碼的sql語句基本相同,是在競爭同一資源,

所以,需要做一個策略,優先把資源讓給查數,數據查完之後再去查頁碼。

限流

由於多線程取數據並沒有從本質上提高資料庫性能,所以必須針對大數據量實時統計排序分頁查詢做限流

我這里打個比方:食堂有6個窗口,物流團隊吃飯要買6個菜,平均每買1個菜需要1分鍾的時間,

如果派我一個人去一個窗口買的話需要6分鍾的時間

假如派6個人分別去6個窗口買這6個菜,只需要1分鍾的時間

但是,如果除了物流團隊,再來其他5個團隊呢,也就是說6個團隊每個團隊買6個菜共買36個菜,

這樣子有的團隊先買完,有的團隊後買完,但平均時間還是6分鍾。本質上沒有變化。

所以,對於特定的查詢條件,必須進行限流。讓每分鍾至多有6個團隊買菜,這樣子能使得情況變得不至於太糟糕。

從根本上改變現狀

這一點從目前來看只能是展望了,比如mysql資料庫換更為強大的oracle資料庫,

或更換InnoDb引擎為其他,或更換SATA硬碟為SSD 。。。。。。

從實踐效果來看,優化後的效果是很明顯的。

相同的查詢條件,原來一個頁面查詢時間由於超過60秒超時了,根據1-6點建議優化之後,查詢時間變為2秒至3.5秒之間。

G. 資料庫上百萬條,內部排序的原理是什麼

查詢時直接排序即可:
select 欄位1,欄位2,... from 你的表 where 條件 order by 欄位3,欄位4 desc,欄位5 desc
結果:版order by 欄位3,欄位4 desc,欄位5 desc:按欄位3從小到權大、欄位4從大到小、欄位5從大到小的順序排列,不用在內存中操作。

H. 跪求一對大數據量浮點數的快速排序演算法啊。。急用!

因為不知道你的數據從哪裡來,是從文本還是手動輸入...所以只提供個思路:
先動態建立個鏈表,用來存浮點數的整數部分,鏈表的每個單元下掛一個小的鏈表(其實只是理解上的小,實際和前面的鏈表是一樣的,下掛的鏈表定義為浮點型的);這里你需要先定義結構體,含有一個整型數據和整型指針,指針存儲下掛的鏈表地址,下掛鏈表用於存儲浮點數的小數部分,然後用該結構體生成數組。這樣所有數據讀取進來後,都是按整數部分劃分存儲在一個鏈表下面,比如2.0034和2.412都是存儲在數據為2的鏈表下面,3.323和3.12124都是存儲在數據為3的鏈表下面。然後再對各個鏈表進行冒泡法排序或者是隨意一個你覺得可以的排序。
如果說整數部分相同但小數部分不同的數據很多很多,可以再往下細分。
希望能對你有所幫助!

I. 如何用java程序對一個大數據集進行排序,排序後再進行組合,在排序,找出最大與最小值 謝謝

1、資料庫排序:將數據存入資料庫,利用資料庫進行索引排序後再取出數據
2、分段排序:規定一個內存大小,據此對數據集進行分段,每次取一部分進行排序

J. 大數據排序或取重或去重相關問題

大數據排序或取重或去重相關問題
1. 給定a、b兩個文件,各存放50億個url,每個url各佔64位元組,內存限制是4G,讓你找出a、b文件共同的url?
方案1:可以估計每個文件安的大小為50G×64=320G,遠遠大於內存限制的4G。所以不可能將其完全載入到內存中處理。考慮採取分而治之的方法。
s 遍歷文件a,對每個url求取 ,然後根據所取得的值將url分別存儲到1000個小文件(記為 )中。這樣每個小文件的大約為300M。
s 遍歷文件b,採取和a相同的方式將url分別存儲到1000各小文件(記為 )。這樣處理後,所有可能相同的url都在對應的小文件( )中,不對應的小文件不可能有相同的url。然後我們只要求出1000對小文件中相同的url即可。
s 求每對小文件中相同的url時,可以把其中一個小文件的url存儲到hash_set中。然後遍歷另一個小文件的每個url,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到文件裡面就可以了。
方案2:如果允許有一定的錯誤率,可以使用Bloom filter,4G內存大概可以表示340億bit。將其中一個文件中的url使用Bloom filter映射為這340億bit,然後挨個讀取另外一個文件的url,檢查是否與Bloom filter,如果是,那麼該url應該是共同的url(注意會有一定的錯誤率)。
2. 有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序。 方案1:
s 順序讀取10個文件,按照hash(query)%10的結果將query寫入到另外10個文件(記為 )中。這樣新生成的文件每個的大小大約也1G(假設hash函數是隨機的)。
s 找一台內存在2G左右的機器,依次對 用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸並排序按照出現次數進行排序。將排序好的query和對應的query_cout輸出到文件中。這樣得到了10個排好序的文件(記為 )。
s 對 這10個文件進行歸並排序(內排序與外排序相結合)。
方案2:
一般query的總量是有限的,只是重復的次數比較多而已,可能對於所有的query,一次性就可以加入到內存了。這樣,我們就可以採用trie樹/hash_map等直接來統計每個query出現的次數,然後按出現次數做快速/堆/歸並排序就可以了。
方案3:
與方案1類似,但在做完hash,分成多個文件後,可以交給多個文件來處理,採用分布式的架構來處理(比如MapRece),最後再進行合並。

3. 有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16位元組,內存限制大小是1M。返回頻數最高的100個詞。
方案1:順序讀文件中,對於每個詞x,取 ,然後按照該值存到5000個小文件(記為 ) 中。這樣每個文件大概是200k左右。如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續往下分,知道分解得到的小文件的大小都不超過1M。對每個小文件,統計每個文件中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點 的最小堆),並把100詞及相應的頻率存入文件,這樣又得到了5000個文件。下一步就是把這5000個文件進行歸並(類似與歸並排序)的過程了。

4. 海量日誌數據,提取出某日訪問網路次數最多的那個IP。
方案1:首先是這一天,並且是訪問網路的日誌中的IP取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有 個 IP。同樣可以採用映射的方法,比如模1000,把整個大文件映射為1000個小文件,再找出每個小文中出現頻率最大的IP(可以採用hash_map進 行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。然後再在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。

5. 在2.5億個整數中找出不重復的整數,內存不足以容納這2.5億個整數。
方案1:採用2-Bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需內存內存,還可以接受。然後掃描這2.5億個整數,查看Bitmap中相對應位,如果是00變01,01變10,10保持不變。所描完事後,查看bitmap,把對應位是01的整數輸出即可。
方案2:也可採用上題類似的方法,進行劃分小文件的方法。然後在小文件中找出不重復的整數,並排序。然後再進行歸並,注意去除重復的元素。

6. 海量數據分布在100台電腦中,想個辦法高校統計出這批數據的TOP10。
方案1:
s 在每台電腦上求出TOP10,可以採用包含10個元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我們首先取前10個元素調整成最小堆,如果發現,然後掃描後面的數據,並與堆頂元素比較,如果比堆頂元素大,那麼用該元素替換堆頂,然後再調整為最小堆。最後堆中的元 素就是TOP10大。
s 求出每台電腦上的TOP10後,然後把這100台電腦上的TOP10組合起來,共1000個數據,再利用上面類似的方法求出TOP10就可以了。

7. 怎麼在海量數據中找出重復次數最多的一個?
方案1:先做hash,然後求模映射為小文件,求出每個小文件中重復次數最多的一個,並記錄重復次數。然後找出上一步求出的數據中重復次數最多的一個就是所求(具體參考前面的題)。

8. 上千萬或上億數據(有重復),統計其中出現次數最多的錢N個數據。
方案1:上千萬或上億的數據,現在的機器的內存應該能存下。所以考慮採用hash_map/搜索二叉樹/紅黑樹等來進行統計次數。然後就是取出前N個出現次數最多的數據了,可以用第6題提到的堆機制完成。

9. 1000萬字元串,其中有些是重復的,需要把重復的全部去掉,保留沒有重復的字元串。請怎麼設計和實現?
方案1:這題用trie樹比較合適,hash_map也應該能行。

10. 一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間復雜度分析。
方案1:這題是考慮時間效率。用trie樹統計每個詞出現的次數,時間復雜度是O(n*le)(le表示單詞的平準長度)。然後是找出出現最頻繁的前10個詞,可以用堆來實現,前面的題中已經講到了,時間復雜度是O(n*lg10)。所以總的時間復雜度,是O(n*le)與O(n*lg10)中較大 的哪一個。

11. 一個文本文件,找出前10個經常出現的詞,但這次文件比較長,說是上億行或十億行,總之無法一次讀入內存,問最優解。
方案1:首先根據用hash並求模,將文件分解為多個小文件,對於單個文件利用上題的方法求出每個文件件中10個最常出現的詞。然後再進行歸並處理,找出最終的10個最常出現的詞。

12. 100w個數中找出最大的100個數。
方案1:在前面的題中,我們已經提到了,用一個含100個元素的最小堆完成。復雜度為O(100w*lg100)。
方案2:採用快速排序的思想,每次分割之後只考慮比軸大的一部分,知道比軸大的一部分在比100多的時候,採用傳統排序演算法排序,取前100個。復雜度為O(100w*100)。
方案3:採用局部淘汰法。選取前100個元素,並排序,記為序列L。然後一次掃描剩餘的元素x,與排好序的100個元素中最小的元素比,如果比這個最小的要大,那麼把這個最小的元素刪除,並把x利用插入排序的思想,插入到序列L中。依次循環,知道掃描了所有的元素。復雜度為O(100w*100)。

13. 尋找熱門查詢:
搜索引擎會通過日誌文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個記錄,這些查詢串的重復讀比較高,雖然總數是1千萬,但是如果去除重復和,不超過3百萬個。一個查詢串的重復度越高,說明查詢它的用戶越多,也就越熱門。請你統計最熱門的10個 查詢串,要求使用的內存不能超過1G。
(1) 請描述你解決這個問題的思路;
(2) 請給出主要的處理流程,演算法,以及演算法的復雜度。
方案1:採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0。最後用10個元素的最小推來對出現頻率進行排序。

14. 一共有N個機器,每個機器上有N個數。每個機器最多存O(N)個數並對它們操作。如何找到 個數中的中數?
方案1:先大體估計一下這些數的范圍,比如這里假設這些數都是32位無符號整數(共有 個)。我們把0到 的整數劃分為N個范圍段,每個段包含 個整數。比如,第一個段位0到 ,第二段為 到 ,…,第N個段為 到 。 然後,掃描每個機器上的N個數,把屬於第一個區段的數放到第一個機器上,屬於第二個區段的數放到第二個機器上,…,屬於第N個區段的數放到第N個機器上。 注意這個過程每個機器上存儲的數應該是O(N)的。下面我們依次統計每個機器上數的個數,一次累加,直到找到第k個機器,在該機器上累加的數大於或等於 ,而在第k-1個機器上的累加數小於 ,並把這個數記為x。那麼我們要找的中位數在第k個機器中,排在第 位。然後我們對第k個機器的數排序,並找出第 個數,即為所求的中位數。復雜度是 的。
方案2:先對每台機器上的數進行排序。排好序後,我們採用歸並排序的思想,將這N個機器上的數歸並起來得到最終的排序。找到第n個便是所求。復雜度是n(i)的。

15. 最大間隙問題
給定n個實數 ,求著n個實數在實軸上向量2個數之間的最大差值,要求線性的時間演算法。
方案1:最先想到的方法就是先對這n個數據進行排序,然後一遍掃描即可確定相鄰的最大間隙。但該方法不能滿足線性時間的要求。故採取如下方法:
s 找到n個數據中最大和最小數據max和min。
s 用n-2個點等分區間[min, max],即將[min, max]等分為n-1個區間(前閉後開區間),將這些區間看作桶,編號為 ,且桶 的上界和桶i+1的下屆相同,即每個桶的大小相同。每個桶的大小為: 。實際上,這些桶的邊界構成了一個等差數列(首項為min,公差為 ),且認為將min放入第一個桶,將max放入第n-1個桶。
s 將n個數放入n-1個桶中:將每個元素 分配到某個桶(編號為index),其中 ,並求出分到每個桶的最大最小數據。
s最大間隙:除最大最小數據max和min以外的n-2個數據放入n-1個桶中,由抽屜原理可知至少有一個桶是空的,又因為每個桶的大小相同,所以最大間隙不會在同一桶中出現,一定是某個桶的上界和氣候某個桶的下界之間隙,且該量筒之間的桶(即便好在該連個便好之間的桶)一定是空桶。也就是說,最大間隙在桶 i的上界和桶j的下界之間產生 。一遍掃描即可完成。

16. 將多個集合合並成沒有交集的集合:給定一個字元串的集合,格式如: 。要求將其中交集不為空的集合合並,要求合並完成的集合之間無交集,例如上例應輸出 。
(1) 請描述你解決這個問題的思路;
(2) 給出主要的處理流程,演算法,以及演算法的復雜度;
(3) 請描述可能的改進。
方案1:採用並查集。首先所有的字元串都在單獨的並查集中。然後依掃描每個集合,順序合並將兩個相鄰元素合並。例如,對於 , 首先查看aaa和bbb是否在同一個並查集中,如果不在,那麼把它們所在的並查集合並,然後再看bbb和ccc是否在同一個並查集中,如果不在,那麼也把它們所在的並查集合並。接下來再掃描其他的集合,當所有的集合都掃描完了,並查集代表的集合便是所求。復雜度應該是O(NlgN)的。改進的話,首先可以 記錄每個節點的根結點,改進查詢。合並的時候,可以把大的和小的進行合,這樣也減少復雜度。
17. 最大子序列與最大子矩陣問題
數組的最大子序列問題:給定一個數組,其中元素有正,也有負,找出其中一個連續子序列,使和最大。
方案1:這個問題可以動態規劃的思想解決。設 表示以第i個元素 結尾的最大子序列,那麼顯然 。基於這一點可以很快用代碼實現。
最大子矩陣問題:給定一個矩陣(二維數組),其中數據有大有小,請找一個子矩陣,使得子矩陣的和最大,並輸出這個和。
方案1:可以採用與最大子序列類似的思想來解決。如果我們確定了選擇第i列和第j列之間的元素,那麼在這個范圍內,其實就是一個最大子序列問題。如何確定第i列和第j列可以詞用暴搜的方法進行。

閱讀全文

與大數據小內存排序相關的資料

熱點內容
有沒有直接看的網站給一個 瀏覽:19
iphone4沒聲音 瀏覽:221
exe專殺工具 瀏覽:793
macword加頁 瀏覽:516
昆明員工文件櫃多少錢一個 瀏覽:824
北京視通信元網路技術有限公司 瀏覽:363
1979年打越南自衛反擊戰電影全集 瀏覽:795
掃碼免費看電影是怎麼回事 瀏覽:583
穿越成朱元璋的弟弟小說 瀏覽:234
c大數據導出 瀏覽:791
資料庫如何做介面視圖 瀏覽:404
女程序員職業規劃 瀏覽:323
微信收藏能收藏多少個文件 瀏覽:161
哪款蘋果電腦玩游戲好 瀏覽:472
js獲取當前頁面的標題 瀏覽:997
威勝智能電表如何採集監測數據 瀏覽:31
如何加密u盤文件夾 瀏覽:860
網站懸浮窗代碼 瀏覽:4
蘋果5外屏都包括什麼 瀏覽:580
好看的愛情電影60分鍾左右的 瀏覽:453

友情鏈接