//?皮爾遜相關(guān)系數(shù)分析
員工經(jīng)過(guò)長(zhǎng)期磨合與沉淀,具備了協(xié)作精神,得以通過(guò)團(tuán)隊(duì)的力量開(kāi)發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)公司堅(jiān)持“專(zhuān)注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩?zhuān)注所以專(zhuān)業(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡(jiǎn)單”。公司專(zhuān)注于為企業(yè)提供網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、電商網(wǎng)站開(kāi)發(fā),微信小程序定制開(kāi)發(fā),軟件按需求定制開(kāi)發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
//?介于?-1?到?1?之間。相關(guān)系數(shù)越接近與1,說(shuō)明兩個(gè)人越相似。
//你先參考下這個(gè)雖然里面只有Python的代碼:?
//我用java去做一下試試
import?java.util.*;
public?class?Test?{
public?static?void?main(String[]?args)?{
MapString,HashMapString,Double?cri?=?new?HashMapString,?HashMapString,?Double();
//模擬數(shù)據(jù)庫(kù)中的數(shù)據(jù),實(shí)際運(yùn)用時(shí)請(qǐng)靈活變動(dòng)
getData(cri);
System.out.println(cri.get("Gene").get("Lady?in?the?Water"));
//獲得評(píng)價(jià)值
System.out.println(getSim(cri,"Gene","Lisa"));
}
//模擬數(shù)據(jù)庫(kù)中的數(shù)據(jù)
public?static?void?getData(MapString,?HashMapString,?Double?cri){
HashMapString,Double?temp?=?new?HashMapString,?Double();
temp.put("Lady?in?the?Water",2.5);
temp.put("Snakes?on?a?Plane",3.5);
temp.put("Just?My?Luck",3.0);
temp.put("Superman?Returns",3.5);
temp.put("You,Me?and?Dupree",2.5);
temp.put("The?Night?Listener",3.0);
cri.put("Lisa",temp);
HashMapString,Double?temp1?=?new?HashMapString,?Double();
temp1.put("Lady?in?the?Water",3.0);
temp1.put("Snakes?on?a?Plane",3.5);
temp1.put("Just?My?Luck",1.5);
temp1.put("Superman?Returns",5.0);
temp1.put("You,Me?and?Dupree",3.5);
temp1.put("The?Night?Listener",3.0);
cri.put("Gene",temp1);
}
public?static?double?getSim(MapString,?HashMapString,?Double?cri,?String?p1,?String?p2){
HashMapString,Double?p1m?=?cri.get(p1);
HashMapString,Double?p2m?=?cri.get(p2);
ListString?simBook?=?new?ArrayListString();
for?(Map.EntryString,?Double?entry?:?p1m.entrySet())?{
if?(p2m.containsKey(entry.getKey())){
simBook.add(entry.getKey());
}
}
//判斷相同元素的個(gè)數(shù)
if?(simBook.size()?==?0){
return?1;
}
//對(duì)所有偏好求和
double?sum1?=?0d,sum2?=?0d;
//求平方和
double?sum1Sq?=?0d,sum2Sq?=?0d;
//求乘積和
double?pSum?=?0d;
for?(String?s?:?simBook)?{
sum1?+=?p1m.get(s);
sum2?+=?p2m.get(s);
sum1Sq?+=?Math.pow(p1m.get(s),2);
sum2Sq?+=?Math.pow(p2m.get(s),2);
pSum?+=?p1m.get(s)*p2m.get(s);
}
//計(jì)算皮爾遜評(píng)價(jià)值
double?num?=?pSum?-?(sum1*sum2/simBook.size());
double?den?=?Math.sqrt((sum1Sq-Math.pow(sum1,2)/simBook.size())*(sum2Sq-Math.pow(sum2,2)/simBook.size()));
if?(den?==?0){
return?0;
}
return?num/den;
}
}
眾所周知,java在處理數(shù)據(jù)量比較大的時(shí)候,加載到內(nèi)存必然會(huì)導(dǎo)致內(nèi)存溢出,而在一些數(shù)據(jù)處理中我們不得不去處理海量數(shù)據(jù),在做數(shù)據(jù)處理中,我們常見(jiàn)的手段是分解,壓縮,并行,臨時(shí)文件等方法;例如,我們要將數(shù)據(jù)庫(kù)(不論是什么數(shù)據(jù)庫(kù))的數(shù)據(jù)導(dǎo)出到一個(gè)文件,一般是Excel或文本格式的CSV;對(duì)于Excel來(lái)講,對(duì)于POI和JXL的接口,你很多時(shí)候沒(méi)有法去控制內(nèi)存什么時(shí)候向磁盤(pán)寫(xiě)入,很惡心,而且這些API在內(nèi)存構(gòu)造的對(duì)象大小將比數(shù)據(jù)原有的大小要大很多倍數(shù),所以你不得不去拆分Excel,還好,POI開(kāi)始意識(shí)到這個(gè)問(wèn)題,在3.8.4的版本后,開(kāi)始提供cache的行數(shù),提供了SXSSFWorkbook的接口,可以設(shè)置在內(nèi)存中的行數(shù),不過(guò)可惜的是,他當(dāng)你超過(guò)這個(gè)行數(shù),每添加一行,它就將相對(duì)行數(shù)前面的一行寫(xiě)入磁盤(pán)(如你設(shè)置2000行的話(huà),當(dāng)你寫(xiě)第20001行的時(shí)候,他會(huì)將第一行寫(xiě)入磁盤(pán)),其實(shí)這個(gè)時(shí)候他些的臨時(shí)文件,以至于不消耗內(nèi)存,不過(guò)這樣你會(huì)發(fā)現(xiàn),刷磁盤(pán)的頻率會(huì)非常高,我們的確不想這樣,因?yàn)槲覀兿胱屗_(dá)到一個(gè)范圍一次性將數(shù)據(jù)刷如磁盤(pán),比如一次刷1M之類(lèi)的做法,可惜現(xiàn)在還沒(méi)有這種API,很痛苦,我自己做過(guò)測(cè)試,通過(guò)寫(xiě)小的Excel比使用目前提供刷磁盤(pán)的API來(lái)寫(xiě)大文件,效率要高一些,而且這樣如果訪問(wèn)的人稍微多一些磁盤(pán)IO可能會(huì)扛不住,因?yàn)镮O資源是非常有限的,所以還是拆文件才是上策;而當(dāng)我們寫(xiě)CSV,也就是文本類(lèi)型的文件,我們很多時(shí)候是可以自己控制的,不過(guò)你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式寫(xiě)入即可被CSV識(shí)別出來(lái);如何寫(xiě)入呢?下面來(lái)說(shuō)說(shuō)。。。在處理數(shù)據(jù)層面,如從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),生成本地文件,寫(xiě)代碼為了方便,我們未必要1M怎么來(lái)處理,這個(gè)交給底層的驅(qū)動(dòng)程序去拆分,對(duì)于我們的程序來(lái)講我們認(rèn)為它是連續(xù)寫(xiě)即可;我們比如想將一個(gè)1000W數(shù)據(jù)的數(shù)據(jù)庫(kù)表,導(dǎo)出到文件;此時(shí),你要么進(jìn)行分頁(yè),oracle當(dāng)然用三層包裝即可,mysql用limit,不過(guò)分頁(yè)每次都會(huì)新的查詢(xún),而且隨著翻頁(yè),會(huì)越來(lái)越慢,其實(shí)我們想拿到一個(gè)句柄,然后向下游動(dòng),編譯一部分?jǐn)?shù)據(jù)(如10000行)將寫(xiě)文件一次(寫(xiě)文件細(xì)節(jié)不多說(shuō)了,這個(gè)是最基本的),需要注意的時(shí)候每次buffer的數(shù)據(jù),在用outputstream寫(xiě)入的時(shí)候,最好flush一下,將緩沖區(qū)清空下;接下來(lái),執(zhí)行一個(gè)沒(méi)有where條件的SQL,會(huì)不會(huì)將內(nèi)存撐爆?是的,這個(gè)問(wèn)題我們值得去思考下,通過(guò)API發(fā)現(xiàn)可以對(duì)SQL進(jìn)行一些操作,例如,通過(guò):PreparedStatementstatement=connection.prepareStatement(sql),這是默認(rèn)得到的預(yù)編譯,還可以通過(guò)設(shè)置:PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);來(lái)設(shè)置游標(biāo)的方式,以至于游標(biāo)不是將數(shù)據(jù)直接cache到本地內(nèi)存,然后通過(guò)設(shè)置statement.setFetchSize(200);設(shè)置游標(biāo)每次遍歷的大小;OK,這個(gè)其實(shí)我用過(guò),oracle用了和沒(méi)用沒(méi)區(qū)別,因?yàn)閛racle的jdbcAPI默認(rèn)就是不會(huì)將數(shù)據(jù)cache到j(luò)ava的內(nèi)存中的,而mysql里頭設(shè)置根本無(wú)效,我上面說(shuō)了一堆廢話(huà),呵呵,我只是想說(shuō),java提供的標(biāo)準(zhǔn)API也未必有效,很多時(shí)候要看廠商的實(shí)現(xiàn)機(jī)制,還有這個(gè)設(shè)置是很多網(wǎng)上說(shuō)有效的,但是這純屬抄襲;對(duì)于oracle上面說(shuō)了不用關(guān)心,他本身就不是cache到內(nèi)存,所以java內(nèi)存不會(huì)導(dǎo)致什么問(wèn)題,如果是mysql,首先必須使用5以上的版本,然后在連接參數(shù)上加上useCursorFetch=true這個(gè)參數(shù),至于游標(biāo)大小可以通過(guò)連接參數(shù)上加上:defaultFetchSize=1000來(lái)設(shè)置,例如:jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNulluseCursorFetch=truedefaultFetchSize=1000上次被這個(gè)問(wèn)題糾結(jié)了很久(mysql的數(shù)據(jù)老導(dǎo)致程序內(nèi)存膨脹,并行2個(gè)直接系統(tǒng)就宕了),還去看了很多源碼才發(fā)現(xiàn)奇跡竟然在這里,最后經(jīng)過(guò)mysql文檔的確認(rèn),然后進(jìn)行測(cè)試,并行多個(gè),而且數(shù)據(jù)量都是500W以上的,都不會(huì)導(dǎo)致內(nèi)存膨脹,GC一切正常,這個(gè)問(wèn)題終于完結(jié)了。我們?cè)倭牧钠渌模瑪?shù)據(jù)拆分和合并,當(dāng)數(shù)據(jù)文件多的時(shí)候我們想合并,當(dāng)文件太大想要拆分,合并和拆分的過(guò)程也會(huì)遇到類(lèi)似的問(wèn)題,還好,這個(gè)在我們可控制的范圍內(nèi),如果文件中的數(shù)據(jù)最終是可以組織的,那么在拆分和合并的時(shí)候,此時(shí)就不要按照數(shù)據(jù)邏輯行數(shù)來(lái)做了,因?yàn)樾袛?shù)最終你需要解釋數(shù)據(jù)本身來(lái)判定,但是只是做拆分是沒(méi)有必要的,你需要的是做二進(jìn)制處理,在這個(gè)二進(jìn)制處理過(guò)程,你要注意了,和平時(shí)read文件不要使用一樣的方式,平時(shí)大多對(duì)一個(gè)文件讀取只是用一次read操作,如果對(duì)于大文件內(nèi)存肯定直接掛掉了,不用多說(shuō),你此時(shí)因該每次讀取一個(gè)可控范圍的數(shù)據(jù),read方法提供了重載的offset和length的范圍,這個(gè)在循環(huán)過(guò)程中自己可以計(jì)算出來(lái),寫(xiě)入大文件和上面一樣,不要讀取到一定程序就要通過(guò)寫(xiě)入流flush到磁盤(pán);其實(shí)對(duì)于小數(shù)據(jù)量的處理在現(xiàn)代的NIO技術(shù)的中也有用到,例如多個(gè)終端同時(shí)請(qǐng)求一個(gè)大文件下載,例如視頻下載吧,在常規(guī)的情況下,如果用java的容器來(lái)處理,一般會(huì)發(fā)生兩種情況:其一為內(nèi)存溢出,因?yàn)槊總€(gè)請(qǐng)求都要加載一個(gè)文件大小的內(nèi)存甚至于,因?yàn)閖ava包裝的時(shí)候會(huì)產(chǎn)生很多其他的內(nèi)存開(kāi)銷(xiāo),如果使用二進(jìn)制會(huì)產(chǎn)生得少一些,而且在經(jīng)過(guò)輸入輸出流的過(guò)程中還會(huì)經(jīng)歷幾次內(nèi)存拷貝,當(dāng)然如果有你類(lèi)似nginx之類(lèi)的中間件,那么你可以通過(guò)send_file模式發(fā)送出去,但是如果你要用程序來(lái)處理的時(shí)候,內(nèi)存除非你足夠大,但是java內(nèi)存再大也會(huì)有GC的時(shí)候,如果你內(nèi)存真的很大,GC的時(shí)候死定了,當(dāng)然這個(gè)地方也可以考慮自己通過(guò)直接內(nèi)存的調(diào)用和釋放來(lái)實(shí)現(xiàn),不過(guò)要求剩余的物理內(nèi)存也足夠大才行,那么足夠大是多大呢?這個(gè)不好說(shuō),要看文件本身的大小和訪問(wèn)的頻率;其二為假如內(nèi)存足夠大,無(wú)限制大,那么此時(shí)的限制就是線(xiàn)程,傳統(tǒng)的IO模型是線(xiàn)程是一個(gè)請(qǐng)求一個(gè)線(xiàn)程,這個(gè)線(xiàn)程從主線(xiàn)程從線(xiàn)程池中分配后,就開(kāi)始工作,經(jīng)過(guò)你的Context包裝、Filter、攔截器、業(yè)務(wù)代碼各個(gè)層次和業(yè)務(wù)邏輯、訪問(wèn)數(shù)據(jù)庫(kù)、訪問(wèn)文件、渲染結(jié)果等等,其實(shí)整個(gè)過(guò)程線(xiàn)程都是被掛住的,所以這部分資源非常有限,而且如果是大文件操作是屬于IO密集型的操作,大量的CPU時(shí)間是空余的,方法最直接當(dāng)然是增加線(xiàn)程數(shù)來(lái)控制,當(dāng)然內(nèi)存足夠大也有足夠的空間來(lái)申請(qǐng)線(xiàn)程池,不過(guò)一般來(lái)講一個(gè)進(jìn)程的線(xiàn)程池一般會(huì)受到限制也不建議太多的,而在有限的系統(tǒng)資源下,要提高性能,我們開(kāi)始有了newIO技術(shù),也就是NIO技術(shù),新版的里面又有了AIO技術(shù),NIO只能算是異步IO,但是在中間讀寫(xiě)過(guò)程仍然是阻塞的(也就是在真正的讀寫(xiě)過(guò)程,但是不會(huì)去關(guān)心中途的響應(yīng)),還未做到真正的異步IO,在監(jiān)聽(tīng)connect的時(shí)候他是不需要很多線(xiàn)程參與的,有單獨(dú)的線(xiàn)程去處理,連接也又傳統(tǒng)的socket變成了selector,對(duì)于不需要進(jìn)行數(shù)據(jù)處理的是無(wú)需分配線(xiàn)程處理的;而AIO通過(guò)了一種所謂的回調(diào)注冊(cè)來(lái)完成,當(dāng)然還需要OS的支持,當(dāng)會(huì)掉的時(shí)候會(huì)去分配線(xiàn)程,目前還不是很成熟,性能最多和NIO吃平,不過(guò)隨著技術(shù)發(fā)展,AIO必然會(huì)超越NIO,目前谷歌V8虛擬機(jī)引擎所驅(qū)動(dòng)的node.js就是類(lèi)似的模式,有關(guān)這種技術(shù)不是本文的說(shuō)明重點(diǎn);將上面兩者結(jié)合起來(lái)就是要解決大文件,還要并行度,最土的方法是將文件每次請(qǐng)求的大小降低到一定程度,如8K(這個(gè)大小是經(jīng)過(guò)測(cè)試后網(wǎng)絡(luò)傳輸較為適宜的大小,本地讀取文件并不需要這么小),如果再做深入一些,可以做一定程度的cache,將多個(gè)請(qǐng)求的一樣的文件,cache在內(nèi)存或分布式緩存中,你不用將整個(gè)文件cache在內(nèi)存中,將近期使用的cache幾秒左右即可,或你可以采用一些熱點(diǎn)的算法來(lái)配合;類(lèi)似迅雷下載的斷點(diǎn)傳送中(不過(guò)迅雷的網(wǎng)絡(luò)協(xié)議不太一樣),它在處理下載數(shù)據(jù)的時(shí)候未必是連續(xù)的,只要最終能合并即可,在服務(wù)器端可以反過(guò)來(lái),誰(shuí)正好需要這塊的數(shù)據(jù),就給它就可以;才用NIO后,可以支持很大的連接和并發(fā),本地通過(guò)NIO做socket連接測(cè)試,100個(gè)終端同時(shí)請(qǐng)求一個(gè)線(xiàn)程的服務(wù)器,正常的WEB應(yīng)用是第一個(gè)文件沒(méi)有發(fā)送完成,第二個(gè)請(qǐng)求要么等待,要么超時(shí),要么直接拒絕得不到連接,改成NIO后此時(shí)100個(gè)請(qǐng)求都能連接上服務(wù)器端,服務(wù)端只需要1個(gè)線(xiàn)程來(lái)處理數(shù)據(jù)就可以,將很多數(shù)據(jù)傳遞給這些連接請(qǐng)求資源,每次讀取一部分?jǐn)?shù)據(jù)傳遞出去,不過(guò)可以計(jì)算的是,在總體長(zhǎng)連接傳輸過(guò)程中總體效率并不會(huì)提升,只是相對(duì)相應(yīng)和所開(kāi)銷(xiāo)的內(nèi)存得到量化控制,這就是技術(shù)的魅力,也許不要太多的算法,不過(guò)你得懂他。類(lèi)似的數(shù)據(jù)處理還有很多,有些時(shí)候還會(huì)將就效率問(wèn)題,比如在HBase的文件拆分和合并過(guò)程中,要不影響線(xiàn)上業(yè)務(wù)是比較難的事情,很多問(wèn)題值得我們?nèi)パ芯繄?chǎng)景,因?yàn)椴煌膱?chǎng)景有不同的方法去解決,但是大同小異,明白思想和方法,明白內(nèi)存和體系架構(gòu),明白你所面臨的是沈陽(yáng)的場(chǎng)景,只是細(xì)節(jié)上改變可以帶來(lái)驚人的效果。
針對(duì)完全沒(méi)有編程經(jīng)驗(yàn)的初學(xué)者,java入門(mén)沒(méi)什么特別好的書(shū),找點(diǎn)視頻看看吧,跟著視頻敲代碼,慢慢就能看懂書(shū)了。
----------------------如果堅(jiān)持要看書(shū)的話(huà)可以考慮以下----------------------
1. head first java
通俗易懂,重點(diǎn)突出的書(shū),比較薄,適合初學(xué)者快速入門(mén),缺點(diǎn)是編輯自以為幽默的加了很多不相干的段子在里面,廢話(huà)太多。
2. Java A beginner's guide by Herbert Schildt
相比head first java,沒(méi)有廢話(huà),語(yǔ)言精煉。
3. 官方的tutorial
免費(fèi)的,在線(xiàn)閱讀的,也不錯(cuò)。
4. 瘋狂java講義
如果英文不夠好的話(huà),可以考慮用這本書(shū)入門(mén),中文世界里寫(xiě)的比較好的
5. Introduction to java programming by Y. Daniel Liang
梁勇這本書(shū)比較厚,講算法比較多,如果你時(shí)間充足的話(huà)可以用這本書(shū)入門(mén)。
----------------------??!一定要避開(kāi)這兩個(gè)大坑?。?---------------------
很多人推薦的core java 和 Thinking in java 其實(shí)并不適合初學(xué)者(沒(méi)有編程經(jīng)驗(yàn)的)。
1. core java內(nèi)容太多太雜,沒(méi)有突出重點(diǎn),并且結(jié)構(gòu)組織的像本字典,適合入門(mén)了以后用來(lái)系統(tǒng)復(fù)習(xí)。
2. Thinking in java 沒(méi)有編程經(jīng)驗(yàn)根本看不懂,過(guò)幾年再看吧,不看也沒(méi)關(guān)系。
文章題目:包含java協(xié)同過(guò)濾代碼實(shí)現(xiàn)的詞條
文章源于:http://vcdvsql.cn/article46/doiephg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣、、關(guān)鍵詞優(yōu)化、小程序開(kāi)發(fā)、Google、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)