導航:首頁 > 源碼編譯 > json壓縮演算法

json壓縮演算法

發布時間:2022-04-22 17:28:52

① 如何利用 python 讀取數據科學中常見幾種文件

前言
如果你是數據行業的一份子,那麼你肯定會知道和不同的數據類型打交道是件多麼麻煩的事。不同數據格式、不同壓縮演算法、不同系統下的不同解析方法——很快就會讓你感到抓狂!噢!我還沒提那些非結構化數據和半結構化數據呢。
對於所有數據科學家和數據工程師來說,和不同的格式打交道都乏味透頂!但現實情況是,人們很少能得到整齊的列表數據。因此,熟悉不同的文件格式、了解處理它們時會遇到的困難以及處理某類數據時的最佳/最高效的方法,對於任何一個數據科學家(或者數據工程師)而言都必不可少。
在本篇文章中,你會了解到數據科學家或數據工程師必須知道的幾種常規格式。我會先向你介紹數據行業里常用的幾種不同的文件格式。隨後,我會向大家介紹如何在 Python 里讀取這些文件格式。
PS:在後文中提到的數據科學家,同樣也包括數據工程師以及所有的數據科學專家。
目錄
文件格式是什麼。數據科學家應當了解各種不同文件格式的原因。不同的文件格式以及從 Python 中讀取這些文件的方法。
1. 逗號分隔值
2. XLSX
3. ZIP
4. 純文本(txt)
5. JSON
6. XML
7. HTML
8. 圖像
9. 分層數據格式
10. PDF
11. DOCX
12. MP3
13. MP4
1. 文件格式是什麼。
文件格式是計算機為了存儲信息而使用的對信息的特殊編碼方式。首先,文件格式代表著文件的類型,如二進制文件或者 ASCII 文件等。其次,它體現了信息組織的方式。比如,逗號分隔值(CSV)文件格式用純文本來儲存列表數據。

為了識別一個文件的格式,你通常會去看這個文件的擴展名。比如,一個以「CSV」格式保存的名為「Data」的文件下方的文件名會顯示為「Data.csv」。看到「.csv」這個擴展名,我們就會清楚地知道這是一個「CSV」文件,並且還可以知道其中的數據是以表格的形式儲存的。
2. 數據科學家應當了解各種不同文件格式的原因。
通常,你碰到的文件類型取決於你當下構造的應用。舉個例子,在一個圖像處理系統中,你需要把圖像作為輸入和輸出。所以,你所見到的文件大都是jpeg、gif 或者 png 格式的。
作為一個數據科學家,你需要了解各種文件格式的底層結構以及相應的優勢和劣勢。只有了解了數據的底層結構,你才能夠進一步去探索它,或者決定如何來儲存相關的數據。
選擇一個最理想的文件格式來儲存數據能夠提升你的模型在處理數據時的性能。
現在,讓我們討論一下下方這些文件格式以及如何在 Python 中讀取它們:
逗號分隔值(CSV)XLSXZIP純文本(txt)JSONXMLHTML圖像分層數據格式PDFDOCXMP3MP4
3. 不同的文件格式以及從 Python 中讀取這些文件的方法。
3.1 逗號分隔值
逗號分隔值文件格式屬於電子表格文件格式的一種。
什麼是電子表格文件格式?
在電子表格文件格式中,數據被儲存在單元格里。每個單元格都處於特定的行和列中。電子表格文件中的列擁有不同的類型。比如說,它可以是字元串型的、日期型的或者整數型的。最常用的電子表格文件格式包括:逗號分隔值(CSV)、Microsoft Excel 電子表格(xls)以及 Microsoft Excel Open XML 電子表格(xlsx)。
CSV 文件中的每一行都代表一份觀察報告,或者也可以說是一條記錄。每一個記錄都包含一個或者更多由逗號分隔的欄位。
有時你看你會遇到用製表符而非逗號來分隔欄位的文件。這種文件格式被稱為 TSV(製表符分隔值)文件格式。
下面是一個用 Notepad 打開的 CSV 文件。

在Python 中從 CSV 文件里讀取數據
現在讓我們看看如何在 Python 中讀取一個 CSV 文件。你可以用 Python 中的「pandas」庫來載入數據。import pandas as pd
df = pd.read_csv(「/home/Loan_Prediction/train.csv」)
上方的代碼將會把 train.csv 文件載入進 DataFrame df 中。
3.2 XLSX文件
XLSX 是 Microsoft Excel Open XML 的文件格式,它同樣可以歸入電子表格文件格式這一類中。它是由 Microsoft Excel 開發的一種基於 XML 文件格式。Microsoft Office 2007 最先採用 XLSX 格式來儲存數據。
在XLSX 中,數據被放在工作表的單元格和列當中。每個 XLSX 文件可能包含一個或者更多工作表,所以一個工作簿中可能會包含多個工作表。
下面是一個在 Microsoft Excel 中打開的「xlsx」文件。

上圖顯示的這個文件里包含多個工作表,這些工作表的名稱分別為 Customers、Employees、Invoice 和 Order。圖片中顯示的是其中一個工作表——「Invoice」——中的數據。
從XLSX 文件讀取數據
讓我們一起來載入一下來自 XLSX 文件的數據並且定義一下相關工作表的名稱。此時,你可以用 Python 中的「pandas」庫來載入這些數據。import pandas as pd
df = pd.read_excel(「/home/Loan_Prediction/train.xlsx」,sheetname = 「Invoice」)
上方的代碼將會把來自「train.xlsx」文件的工作表「Invoice」載入進 DataFrame df 中。
3.3 ZIP 文件
ZIP 格式是一種歸檔文件格式。
什麼是歸檔文件格式?
在歸檔文件格式中,你可以創建一個包含多個文件和元數據的文件。歸檔文件格式通常用於將多個數據文件放入一個文件中的過程。這么做是為了方便對這些文件進行壓縮從而減少儲存它們所需的存儲空間。
有很多種常用的電腦數據歸檔格式可以創建歸檔文件。Zip、RAR 和 Tar 是最常用的3種用於壓縮數據的歸檔文件格式。
因此,ZIP 文件格式是一種無損壓縮格式,這意味著如果你用 ZIP 格式壓縮了多個文件,那麼在解壓縮之後你能夠完全恢復這些數據。ZIP 文件格式使用多種壓縮演算法來壓縮文件。你可以通過 .zip 這個擴展名輕易地識別出一個 ZIP 文件。
在Python 中讀取 .ZIP 文件
你可以通過導入「zipfile」包來讀取 zip 文件。下方的代碼可以實現讀取「T.zip」中的「train.csv」文件。import zipfile
在這里我已經討論了其中一種最常用的歸檔格式,也已經討論了如何在 python 中打開這種歸檔格式。我不會再對其他的歸檔格式進行展開討論。如果你想了解不同類型的歸檔格式並且想對其做出比較

② golang生成的json是格式化後的,有沒有提供方法壓縮一下

golang生成的json是格式化後的,有沒有提供方法壓縮一下 那些空格換行也佔用不了多少空間, 要壓縮可以自己寫個正則, 把那些空格、換行去掉就行了。

③ 服務化架構的分布式事務問題用什麼方法解決

1. 性能和時延問題

在服務化之前,業務通常都是本地API調用,本地方法調用性能損耗較小。服務化之後,服務提供者和消費者之間採用遠程網路通信,增加了額外的性能損耗:

1) 客戶端需要對消息進行序列化,主要佔用CPU計算資源。

2) 序列化時需要創建二進制數組,耗費JVM堆內存或者堆外內存。

3) 客戶端需要將序列化之後的二進制數組發送給服務端,佔用網路帶寬資源。

4) 服務端讀取到碼流之後,需要將請求數據報反序列化成請求對象,佔用CPU計算資源。

5) 服務端通過反射的方式調用服務提供者實現類,反射本身對性能影響就比較大。

6) 服務端將響應結果序列化,佔用CPU計算資源。

7) 服務端將應答碼流發送給客戶端,佔用網路帶寬資源。

8) 客戶端讀取應答碼流,反序列化成響應消息,佔用CPU資源。

通過分析我們發現,一個簡單的本地方法調用,切換成遠程服務調用之後,額外增加了很多處理流程,不僅佔用大量的系統資源,同時增加了時延。一些復雜
的應用會拆分成多個服務,形成服務調用鏈,如果服務化框架的性能比較差、服務調用時延也比較大,業務服務化之後的性能和時延將無法滿足業務的性能需求。

1.1RPC框架高性能設計

影響RPC框架性能的主要因素有三個。

1) I/O調度模型:同步阻塞I/O(BIO)還是非阻塞I/O(NIO)。

2) 序列化框架的選擇:文本協議、二進制協議或壓縮二進制協議。

3) 線程調度模型:串列調度還是並行調度,鎖競爭還是無鎖化演算法。

1. I/O調度模型

在I/O編程過程中,當需要同時處理多個客戶端接入請求時,可以利用多線程或者I/O多路復用技術進行處理。I/O多路復用技術通過把多個I/O的
阻塞復用到同一個select的阻塞上,從而使得系統在單線程的情況下可以同時處理多個客戶端請求。與傳統的多線程/多進程模型比,I/O多路復用的最大
優勢是系統開銷小,系統不需要創建新的額外進程或者線程,也不需要維護這些進程和線程的運行,降低了系統的維護工作量,節省了系統資源。

JDK1.5_update10版本使用epoll替代了傳統的select/poll,極大地提升了NIO通信的性能,它的工作原理如圖1-1所示。

圖1-1非阻塞I/O工作原理

Netty是一個開源的高性能NIO通信框架:它的I/O線程NioEventLoop由於聚合了多路復用器Selector,可以同時並發處理成
百上千個客戶端Channel。由於讀寫操作都是非阻塞的,這就可以充分提升I/O線程的運行效率,避免由於頻繁I/O阻塞導致的線程掛起。另外,由於
Netty採用了非同步通信模式,一個I/O線程可以並發處理N個客戶端連接和讀寫操作,這從根本上解決了傳統同步阻塞I/O一連接一線程模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升。

Netty被精心設計,提供了很多獨特的性能提升特性,使它做到了在各種NIO框架中性能排名第一,它的性能優化措施總結如下。

1) 零拷貝:(1)Netty的接收和發送ByteBuffer採用DIRECT
BUFFERS,使用堆外直接內存進行Socket讀寫,不需要進行位元組緩沖區的二次拷貝。如果使用傳統的堆內存(HEAP
BUFFERS)進行Socket讀寫,JVM會將堆內存Buffer拷貝一份到直接內存中,然後才寫入Socket中。相比於堆外直接內存,消息在發送
過程中多了一次緩沖區的內存拷貝。(2)Netty提供了組合Buffer對象,可以聚合多個ByteBuffer對象,用戶可以像操作一個Buffer
那樣方便地對組合Buffer進行操作,避免了傳統通過內存拷貝的方式將幾個小Buffer合並成一個大的Buffer。(3)Netty的文件傳輸採用
了transferTo方法,它可以直接將文件緩沖區的數據發送到目標Channel,避免了傳統通過循環write方式導致的內存拷貝問題。

2)
內存池:隨著JVM虛擬機和JIT即時編譯技術的發展,對象的分配和回收是個非常輕量級的工作。但是對於緩沖區Buffer,情況卻稍有不同,特別是對於
堆外直接內存的分配和回收,是一件耗時的操作。為了盡量重用緩沖區,Netty提供了基於內存池的緩沖區重用機制。性能測試表明,採用內存池的
ByteBuf相比於朝生夕滅的ByteBuf,性能高23倍左右(性能數據與使用場景強相關)。

3)
無鎖化的串列設計:在大多數場景下,並行多線程處理可以提升系統的並發性能。但是,如果對於共享資源的並發訪問處理不當,會帶來嚴重的鎖競爭,這最終會導
致性能的下降。為了盡可能地避免鎖競爭帶來的性能損耗,可以通過串列化設計,即消息的處理盡可能在同一個線程內完成,期間不進行線程切換,這樣就避免了多
線程競爭和同步鎖。為了盡可能提升性能,Netty採用了串列無鎖化設計,在I/O線程內部進行串列操作,避免多線程競爭導致的性能下降。表面上看,串列
化設計似乎CPU利用率不高,並發程度不夠。但是,通過調整NIO線程池的線程參數,可以同時啟動多個串列化的線程並行運行,這種局部無鎖化的串列線程設
計相比一個隊列-多個工作線程模型性能更優。

4) 高效的並發編程:volatile的大量、正確使用;CAS和原子類的廣泛使用;線程安全容器的使用;通過讀寫鎖提升並發性能。

2. 高性能序列化框架

影響序列化性能的關鍵因素總結如下。

1) 序列化後的碼流大小(網路帶寬的佔用)。

2) 序列化&反序列化的性能(CPU資源佔用)。

3) 是否支持跨語言(異構系統的對接和開發語言切換)。

4) 並發調用的性能表現:穩定性、線性增長、偶現的時延毛刺等。

相比於JSON等文本協議,二進制序列化框架性能更優異,以java原生序列化和Protobuf二進制序列化為例進行性能測試對比,結果如圖1-2所示。

圖1-2序列化性能測試對比數據

在序列化框架的技術選型中,如無特殊要求,盡量選擇性能更優的二進制序列化框架,碼流是否壓縮,則需要根據通信內容做靈活選擇,對於圖片、音頻、有大量重復內容的文本文件(例如小說)可以採用碼流壓縮,常用的壓縮演算法包括GZip、Zig-Zag等。

3. 高性能的Reactor線程模型

該模型的特點總結如下。

1) 有專門一個NIO線程:Acceptor線程用於監聽服務端,接收客戶端的TCP連接請求。

2) 網路I/O操作:讀、寫等由一個NIO線程池負責,線程池可以採用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送。

3) 1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止產生並發操作。

由於Reactor模式使用的是非同步非阻塞I/O,所有的I/O操作都不會導致阻塞,理論上一個線程可以獨立處理所有I/O相關的操作,因此在絕大多數場景下,Reactor多線程模型都可以完全滿足業務性能需求。

Reactor線程調度模型的工作原理示意如圖1-3所示。

圖1-3高性能的Reactor線程調度模型

1.2業務最佳實踐

要保證高性能,單依靠分布式服務框架是不夠的,還需要應用的配合,應用服務化高性能實踐總結如下:

1) 能非同步的盡可能使用非同步或者並行服務調用,提升服務的吞吐量,有效降低服務調用時延。

2) 無論是NIO通信框架的線程池還是後端業務線程池,線程參數的配置必須合理。如果採用JDK默認的線程池,最大線程數建議不超過20個。因為JDK的線程池默認採用N個線程爭用1個同步阻塞隊列方式,當線程數過大時,會導致激烈的鎖競爭,此時性能不僅不會提升,反而會下降。

3)
盡量減小要傳輸的碼流大小,提升性能。本地調用時,由於在同一塊堆內存中訪問,參數大小對性能沒有任何影響。跨進程通信時,往往傳遞的是個復雜對象,如果
明確對方只使用其中的某幾個欄位或者某個對象引用,則不要把整個復雜對象都傳遞過去。舉例,對象A持有8個基本類型的欄位,2個復雜對象B和C。如果明確
服務提供者只需要用到A聚合的C對象,則請求參數應該是C,而不是整個對象A。

4) 設置合適的客戶端超時時間,防止業務高峰期因為服務端響應慢導致業務線程等應答時被阻塞,進而引起後續其他服務的消息在隊列中排隊,造成故障擴散。

5) 對於重要的服務,可以單獨部署到獨立的服務線程池中,與其他非核心服務做隔離,保障核心服務的高效運行。

6) 利用Docker等輕量級OS容器部署服務,對服務做物理資源層隔離,避免虛擬化之後導致的超過20%的性能損耗。

7) 設置合理的服務調度優先順序,並根據線上性能監控數據做實時調整。

2. 事務一致性問題

服務化之前,業務採用本地事務,多個本地SQL調用可以用一個大的事務塊封裝起來,如果某一個資料庫操作發生異常,就可以將之前的SQL操作進行回滾,只有所有SQL操作全部成功,才最終提交,這就保證了事務強一致性,如圖2-1所示。

服務化之後,三個資料庫操作可能被拆分到獨立的三個資料庫訪問服務中,此時原來的本地SQL調用演變成了遠程服務調用,事務一致性無法得到保證,如圖2-2所示。

圖2-2服務化之後引入分布式事務問題

假如服務A和服務B調用成功,則A和B的SQL將會被提交,最後執行服務C,它的SQL操作失敗,對於應用1消費者而言,服務A和服務B的相關
SQL操作已經提交,服務C發生了回滾,這就導致事務不一致。從圖2-2可以得知,服務化之後事務不一致主要是由服務分布式部署導致的,因此也被稱為分布
式事務問題。

2.1分布式事務設計方案

通常,分布式事務基於兩階段提交實現,它的工作原理示意圖如圖2-3所示。

圖2-3兩階段提交原理圖

階段1:全局事務管理器向所有事務參與者發送准備請求;事務參與者向全局事務管理器回復自己是否准備就緒。

階段2:全局事務管理器接收到所有事務參與者的回復之後做判斷,如果所有事務參與者都可以提交,則向所有事務提交者發送提交申請,否則進行回滾。事務參與者根據全局事務管理器的指令進行提交或者回滾操作。

分布式事務回滾原理圖如圖2-4所示。

圖2-4分布式事務回滾原理圖

兩階段提交採用的是悲觀鎖策略,由於各個事務參與者需要等待響應最慢的參與者,因此性能比較差。第一個問題是協議本身的成本:整個協議過程是需要加
鎖的,比如鎖住資料庫的某條記錄,且需要持久化大量事務狀態相關的操作日誌。更為麻煩的是,兩階段鎖在出現故障時表現出來的脆弱性,比如兩階段鎖的致命缺
陷:當協調者出現故障,整個事務需要等到協調者恢復後才能繼續執行,如果協調者出現類似磁碟故障等錯誤,該事務將被永久遺棄。

對於分布式服務框架而言,從功能特性上需要支持分布式事務。在實際業務使用過程中,如果能夠通過最終一致性解決問題,則不需要做強一致性;如果能夠避免分布式事務,則盡量在業務層避免使用分布式事務。

2.2分布式事務優化

既然分布式事務有諸多缺點,那麼為什麼我們還在使用呢?有沒有更好的解決方案來改進或者替換呢?如果我們只是針對分布式事務去優化的話,發現其實能改進的空間很小,畢竟瓶頸在分布式事務模型本身。

那我們回到問題的根源:為什麼我們需要分布式事務?因為我們需要各個資源數據保持一致性,但是對於分布式事務提供的強一致性,所有業務場景真的都需
要嗎?大多數業務場景都能容忍短暫的不一致,不同的業務對不一致的容忍時間不同。像銀行轉賬業務,中間有幾分鍾的不一致時間,用戶通常都是可以理解和容忍
的。

在大多數的業務場景中,我們可以使用最終一致性替代傳統的強一致性,盡量避免使用分布式事務。

在實踐中常用的最終一致性方案就是使用帶有事務功能的MQ做中間人角色,它的工作原理如下:在做本地事務之前,先向MQ發送一個prepare消
息,然後執行本地事務,本地事務提交成功的話,向MQ發送一個commit消息,否則發送一個rollback消息,取消之前的消息。MQ只會在收到
commit確認才會將消息投遞出去,所以這樣的形式可以保證在一切正常的情況下,本地事務和MQ可以達到一致性。但是分布式調用存在很多異常場景,諸如
網路超時、VM宕機等。假如系統執行了local_tx()成功之後,還沒來得及將commit消息發送給MQ,或者說發送出去由於網路超時等原因,MQ
沒有收到commit,發生了commit消息丟失,那麼MQ就不會把prepare消息投遞出去。MQ會根據策略去嘗試詢問(回調)發消息的系統
(checkCommit)進行檢查該消息是否應該投遞出去或者丟棄,得到系統的確認之後,MQ會做投遞還是丟棄,這樣就完全保證了MQ和發消息的系統的
一致性,從而保證了接收消息系統的一致性。

3. 研發團隊協作問題

服務化之後,特別是採用微服務架構以後。研發團隊會被拆分成多個服務化小組,例如AWS的Two Pizza Team,每個團隊由2~3名研發負責服務的開發、測試、部署上線、運維和運營等。

隨著服務數的膨脹,研發團隊的增多,跨團隊的協同配合將會成為一個制約研發效率提升的因素。

3.1共用服務注冊中心

為了方便開發測試,經常會在線下共用一個所有服務共享的服務注冊中心,這時,一個正在開發中的服務發布到服務注冊中心,可能會導致一些消費者不可用。

解決方案:可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其他服務),而不注冊正在開發的服務,通過直連測試正在開發的服務。

它的工作原理如圖3-1所示。

圖3-1隻訂閱,不發布

3.2直連提供者

在開發和測試環境下,如果公共的服務注冊中心沒有搭建,消費者將無法獲取服務提供者的地址列表,只能做本地單元測試或使用模擬樁測試。

還有一種場景就是在實際測試中,服務提供者往往多實例部署,如果服務提供者存在Bug,就需要做遠程斷點調試,這會帶來兩個問題:

1) 服務提供者多實例部署,遠程調試地址無法確定,調試效率低下。

2) 多個消費者可能共用一套測試聯調環境,斷點調試過程中可能被其他消費者意外打斷。

解決策略:繞過注冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直聯方式將以服務介面為單位,忽略注冊中心的提供者列表。

3.3多團隊進度協同

假如前端Web門戶依賴後台A、B、C和D
4個服務,分別由4個不同的研發團隊負責,門戶要求新特性2周內上線。A和B內部需求優先順序排序將門戶的優先順序排的比較高,可以滿足交付時間點。但是C和
D服務所在團隊由於同時需要開發其他優先順序更高的服務,因此把優先順序排的相對較低,無法滿足2周交付。

在C和D提供版本之前,門戶只能先通過打測試樁的方式完成Mock測試,但是由於並沒有真實的測試過C和D服務,因此需求無法按期交付。

應用依賴的服務越多,特性交付效率就越低下,交付的速度取決於依賴的最遲交付的那個服務。假如Web門戶依賴後台的100個服務,只要1個核心服務沒有按期交付,則整個進度就會延遲。

解決方案:調用鏈可以將應用、服務和中間件之間的依賴關系串接並展示出來,基於調用鏈首入口的交付日期作為輸入,利用依賴管理工具,可以自動計算出調用鏈上各個服務的最遲交付時間點。通過調用鏈分析和標准化的依賴計算工具,可以避免人為需求排序失誤導致的需求延期。

3.4服務降級和Mock測試

在實際項目開發中,由於小組之間、個人開發者之間開發節奏不一致,經常會出現消費者等待依賴的服務提供者提供聯調版本的情況,相互等待會降低項目的研發進度。

解決方案:服務提供者首先將介面定下來並提供給消費者,消費者可以將服務降級同Mock測試結合起來,在Mock測試代碼中實現容錯降級的業務邏輯(業務放通),這樣既完成了Mock測試,又實現了服務降級的業務邏輯開發,一舉兩得。

3.5協同調試問題

在實際項目開發過程中,各研發團隊進度不一致很正常。如果消費者坐等服務提供者按時提供版本,往往會造成人力資源浪費,影響項目進度。

解決方案:分布式服務框架提供Mock樁管理框架,當周邊服務提供者尚未完成開發時,將路由切換到模擬測試模式,自動調用Mock樁;業務集成測試和上線時,則要能夠自動切換到真實的服務提供者上,可以結合服務降級功能實現。

3.6介面前向兼容性

由於線上的Bug修復、內部重構和需求變更,服務提供者會經常修改內部實現,包括但不限於:介面參數變化、參數欄位變化、業務邏輯變化和數據表結構變化。

在實際項目中經常會發生服務提供者修改了介面或者數據結構,但是並沒有及時知會到所有消費者,導致服務調用失敗。

解決方案:

1) 制定並嚴格執行《服務前向兼容性規范》,避免發生不兼容修改或者私自修改不通知周邊的情況。

2) 介面兼容性技術保障:例如Thrift的IDL,支持新增、修改和刪除欄位,欄位定義位置無關性,碼流支持亂序等。

4. 總結

服務化之後,無論是服務化框架,還是業務服務,都面臨諸多挑戰,本章摘取了其中一些比較重要的問題,並給出解決方案和最佳實踐。對於本章節沒有列出的問題,則需要服務框架開發者和使用者在實踐中探索,找出一條適合自己產品的服務化最佳實踐。

④ golang生成的json是格式化後的,有沒有提供方法壓縮一下

那些空格換行也佔用不了多少空間,
要壓縮可以自己寫個正則,
把那些空格、換行去掉就行了。

⑤ golang生成的json是格式化後的,有沒有提供方法壓縮一下

golang生成的json是格式化後的,有沒有提供方法壓縮一下
那些空格換行也佔用不了多少空間, 要壓縮可以自己寫個正則, 把那些空格、換行去掉就行了。

⑥ 求救,分布式事務怎麼處理

1.性能和時延問題在服務化之前,業務通常都是本地API調用,本地方法調用性能損耗較小。服務化之後,服務提供者和消費者之間採用遠程網路通信,增加了額外的性能損耗:1)客戶端需要對消息進行序列化,主要佔用CPU計算資源。2)序列化時需要創建二進制數組,耗費JVM堆內存或者堆外內存。3)客戶端需要將序列化之後的二進制數組發送給服務端,佔用網路帶寬資源。4)服務端讀取到碼流之後,需要將請求數據報反序列化成請求對象,佔用CPU計算資源。5)服務端通過反射的方式調用服務提供者實現類,反射本身對性能影響就比較大。6)服務端將響應結果序列化,佔用CPU計算資源。7)服務端將應答碼流發送給客戶端,佔用網路帶寬資源。8)客戶端讀取應答碼流,反序列化成響應消息,佔用CPU資源。通過分析我們發現,一個簡單的本地方法調用,切換成遠程服務調用之後,額外增加了很多處理流程,不僅佔用大量的系統資源,同時增加了時延。一些復雜的應用會拆分成多個服務,形成服務調用鏈,如果服務化框架的性能比較差、服務調用時延也比較大,業務服務化之後的性能和時延將無法滿足業務的性能需求。1.1RPC框架高性能設計影響RPC框架性能的主要因素有三個。1)I/O調度模型:同步阻塞I/O(BIO)還是非阻塞I/O(NIO)。2)序列化框架的選擇:文本協議、二進制協議或壓縮二進制協議。3)線程調度模型:串列調度還是並行調度,鎖競爭還是無鎖化演算法。1.I/O調度模型在I/O編程過程中,當需要同時處理多個客戶端接入請求時,可以利用多線程或者I/O多路復用技術進行處理。I/O多路復用技術通過把多個I/O的阻塞復用到同一個select的阻塞上,從而使得系統在單線程的情況下可以同時處理多個客戶端請求。與傳統的多線程/多進程模型比,I/O多路復用的最大優勢是系統開銷小,系統不需要創建新的額外進程或者線程,也不需要維護這些進程和線程的運行,降低了系統的維護工作量,節省了系統資源。JDK1.5_update10版本使用epoll替代了傳統的select/poll,極大地提升了NIO通信的性能,它的工作原理如圖1-1所示。圖1-1非阻塞I/O工作原理Netty是一個開源的高性能NIO通信框架:它的I/O線程NioEventLoop由於聚合了多路復用器Selector,可以同時並發處理成百上千個客戶端Channel。由於讀寫操作都是非阻塞的,這就可以充分提升I/O線程的運行效率,避免由於頻繁I/O阻塞導致的線程掛起。另外,由於Netty採用了非同步通信模式,一個I/O線程可以並發處理N個客戶端連接和讀寫操作,這從根本上解決了傳統同步阻塞I/O一連接一線程模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升。Netty被精心設計,提供了很多獨特的性能提升特性,使它做到了在各種NIO框架中性能排名第一,它的性能優化措施總結如下。1)零拷貝:(1)Netty的接收和發送ByteBuffer採用DIRECTBUFFERS,使用堆外直接內存進行Socket讀寫,不需要進行位元組緩沖區的二次拷貝。如果使用傳統的堆內存(HEAPBUFFERS)進行Socket讀寫,JVM會將堆內存Buffer拷貝一份到直接內存中,然後才寫入Socket中。相比於堆外直接內存,消息在發送過程中多了一次緩沖區的內存拷貝。(2)Netty提供了組合Buffer對象,可以聚合多個ByteBuffer對象,用戶可以像操作一個Buffer那樣方便地對組合Buffer進行操作,避免了傳統通過內存拷貝的方式將幾個小Buffer合並成一個大的Buffer。(3)Netty的文件傳輸採用了transferTo方法,它可以直接將文件緩沖區的數據發送到目標Channel,避免了傳統通過循環write方式導致的內存拷貝問題。2)內存池:隨著JVM虛擬機和JIT即時編譯技術的發展,對象的分配和回收是個非常輕量級的工作。但是對於緩沖區Buffer,情況卻稍有不同,特別是對於堆外直接內存的分配和回收,是一件耗時的操作。為了盡量重用緩沖區,Netty提供了基於內存池的緩沖區重用機制。性能測試表明,採用內存池的ByteBuf相比於朝生夕滅的ByteBuf,性能高23倍左右(性能數據與使用場景強相關)。3)無鎖化的串列設計:在大多數場景下,並行多線程處理可以提升系統的並發性能。但是,如果對於共享資源的並發訪問處理不當,會帶來嚴重的鎖競爭,這最終會導致性能的下降。為了盡可能地避免鎖競爭帶來的性能損耗,可以通過串列化設計,即消息的處理盡可能在同一個線程內完成,期間不進行線程切換,這樣就避免了多線程競爭和同步鎖。為了盡可能提升性能,Netty採用了串列無鎖化設計,在I/O線程內部進行串列操作,避免多線程競爭導致的性能下降。表面上看,串列化設計似乎CPU利用率不高,並發程度不夠。但是,通過調整NIO線程池的線程參數,可以同時啟動多個串列化的線程並行運行,這種局部無鎖化的串列線程設計相比一個隊列-多個工作線程模型性能更優。4)高效的並發編程:volatile的大量、正確使用;CAS和原子類的廣泛使用;線程安全容器的使用;通過讀寫鎖提升並發性能。2.高性能序列化框架影響序列化性能的關鍵因素總結如下。1)序列化後的碼流大小(網路帶寬的佔用)。2)序列化&反序列化的性能(CPU資源佔用)。3)是否支持跨語言(異構系統的對接和開發語言切換)。4)並發調用的性能表現:穩定性、線性增長、偶現的時延毛刺等。相比於JSON等文本協議,二進制序列化框架性能更優異,以Java原生序列化和Protobuf二進制序列化為例進行性能測試對比,結果如圖1-2所示。圖1-2序列化性能測試對比數據在序列化框架的技術選型中,如無特殊要求,盡量選擇性能更優的二進制序列化框架,碼流是否壓縮,則需要根據通信內容做靈活選擇,對於圖片、音頻、有大量重復內容的文本文件(例如小說)可以採用碼流壓縮,常用的壓縮演算法包括GZip、Zig-Zag等。3.高性能的Reactor線程模型該模型的特點總結如下。1)有專門一個NIO線程:Acceptor線程用於監聽服務端,接收客戶端的TCP連接請求。2)網路I/O操作:讀、寫等由一個NIO線程池負責,線程池可以採用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送。3)1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止產生並發操作。由於Reactor模式使用的是非同步非阻塞I/O,所有的I/O操作都不會導致阻塞,理論上一個線程可以獨立處理所有I/O相關的操作,因此在絕大多數場景下,Reactor多線程模型都可以完全滿足業務性能需求。Reactor線程調度模型的工作原理示意如圖1-3所示。圖1-3高性能的Reactor線程調度模型1.2業務最佳實踐要保證高性能,單依靠分布式服務框架是不夠的,還需要應用的配合,應用服務化高性能實踐總結如下:1)能非同步的盡可能使用非同步或者並行服務調用,提升服務的吞吐量,有效降低服務調用時延。2)無論是NIO通信框架的線程池還是後端業務線程池,線程參數的配置必須合理。如果採用JDK默認的線程池,最大線程數建議不超過20個。因為JDK的線程池默認採用N個線程爭用1個同步阻塞隊列方式,當線程數過大時,會導致激烈的鎖競爭,此時性能不僅不會提升,反而會下降。3)盡量減小要傳輸的碼流大小,提升性能。本地調用時,由於在同一塊堆內存中訪問,參數大小對性能沒有任何影響。跨進程通信時,往往傳遞的是個復雜對象,如果明確對方只使用其中的某幾個欄位或者某個對象引用,則不要把整個復雜對象都傳遞過去。舉例,對象A持有8個基本類型的欄位,2個復雜對象B和C。如果明確服務提供者只需要用到A聚合的C對象,則請求參數應該是C,而不是整個對象A。4)設置合適的客戶端超時時間,防止業務高峰期因為服務端響應慢導致業務線程等應答時被阻塞,進而引起後續其他服務的消息在隊列中排隊,造成故障擴散。5)對於重要的服務,可以單獨部署到獨立的服務線程池中,與其他非核心服務做隔離,保障核心服務的高效運行。6)利用Docker等輕量級OS容器部署服務,對服務做物理資源層隔離,避免虛擬化之後導致的超過20%的性能損耗。7)設置合理的服務調度優先順序,並根據線上性能監控數據做實時調整。2.事務一致性問題服務化之前,業務採用本地事務,多個本地SQL調用可以用一個大的事務塊封裝起來,如果某一個資料庫操作發生異常,就可以將之前的SQL操作進行回滾,只有所有SQL操作全部成功,才最終提交,這就保證了事務強一致性,如圖2-1所示。服務化之後,三個資料庫操作可能被拆分到獨立的三個資料庫訪問服務中,此時原來的本地SQL調用演變成了遠程服務調用,事務一致性無法得到保證,如圖2-2所示。圖2-2服務化之後引入分布式事務問題假如服務A和服務B調用成功,則A和B的SQL將會被提交,最後執行服務C,它的SQL操作失敗,對於應用1消費者而言,服務A和服務B的相關SQL操作已經提交,服務C發生了回滾,這就導致事務不一致。從圖2-2可以得知,服務化之後事務不一致主要是由服務分布式部署導致的,因此也被稱為分布式事務問題。2.1分布式事務設計方案通常,分布式事務基於兩階段提交實現,它的工作原理示意圖如圖2-3所示。圖2-3兩階段提交原理圖階段1:全局事務管理器向所有事務參與者發送准備請求;事務參與者向全局事務管理器回復自己是否准備就緒。階段2:全局事務管理器接收到所有事務參與者的回復之後做判斷,如果所有事務參與者都可以提交,則向所有事務提交者發送提交申請,否則進行回滾。事務參與者根據全局事務管理器的指令進行提交或者回滾操作。分布式事務回滾原理圖如圖2-4所示。圖2-4分布式事務回滾原理圖兩階段提交採用的是悲觀鎖策略,由於各個事務參與者需要等待響應最慢的參與者,因此性能比較差。第一個問題是協議本身的成本:整個協議過程是需要加鎖的,比如鎖住資料庫的某條記錄,且需要持久化大量事務狀態相關的操作日誌。更為麻煩的是,兩階段鎖在出現故障時表現出來的脆弱性,比如兩階段鎖的致命缺陷:當協調者出現故障,整個事務需要等到協調者恢復後才能繼續執行,如果協調者出現類似磁碟故障等錯誤,該事務將被永久遺棄。對於分布式服務框架而言,從功能特性上需要支持分布式事務。在實際業務使用過程中,如果能夠通過最終一致性解決問題,則不需要做強一致性;如果能夠避免分布式事務,則盡量在業務層避免使用分布式事務。2.2分布式事務優化既然分布式事務有諸多缺點,那麼為什麼我們還在使用呢?有沒有更好的解決方案來改進或者替換呢?如果我們只是針對分布式事務去優化的話,發現其實能改進的空間很小,畢竟瓶頸在分布式事務模型本身。那我們回到問題的根源:為什麼我們需要分布式事務?因為我們需要各個資源數據保持一致性,但是對於分布式事務提供的強一致性,所有業務場景真的都需要嗎?大多數業務場景都能容忍短暫的不一致,不同的業務對不一致的容忍時間不同。像銀行轉賬業務,中間有幾分鍾的不一致時間,用戶通常都是可以理解和容忍的。在大多數的業務場景中,我們可以使用最終一致性替代傳統的強一致性,盡量避免使用分布式事務。在實踐中常用的最終一致性方案就是使用帶有事務功能的MQ做中間人角色,它的工作原理如下:在做本地事務之前,先向MQ發送一個prepare消息,然後執行本地事務,本地事務提交成功的話,向MQ發送一個commit消息,否則發送一個rollback消息,取消之前的消息。MQ只會在收到commit確認才會將消息投遞出去,所以這樣的形式可以保證在一切正常的情況下,本地事務和MQ可以達到一致性。但是分布式調用存在很多異常場景,諸如網路超時、VM宕機等。假如系統執行了local_tx()成功之後,還沒來得及將commit消息發送給MQ,或者說發送出去由於網路超時等原因,MQ沒有收到commit,發生了commit消息丟失,那麼MQ就不會把prepare消息投遞出去。MQ會根據策略去嘗試詢問(回調)發消息的系統(checkCommit)進行檢查該消息是否應該投遞出去或者丟棄,得到系統的確認之後,MQ會做投遞還是丟棄,這樣就完全保證了MQ和發消息的系統的一致性,從而保證了接收消息系統的一致性。3.研發團隊協作問題服務化之後,特別是採用微服務架構以後。研發團隊會被拆分成多個服務化小組,例如AWS的TwoPizzaTeam,每個團隊由2~3名研發負責服務的開發、測試、部署上線、運維和運營等。隨著服務數的膨脹,研發團隊的增多,跨團隊的協同配合將會成為一個制約研發效率提升的因素。3.1共用服務注冊中心為了方便開發測試,經常會在線下共用一個所有服務共享的服務注冊中心,這時,一個正在開發中的服務發布到服務注冊中心,可能會導致一些消費者不可用。解決方案:可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其他服務),而不注冊正在開發的服務,通過直連測試正在開發的服務。它的工作原理如圖3-1所示。圖3-1隻訂閱,不發布3.2直連提供者在開發和測試環境下,如果公共的服務注冊中心沒有搭建,消費者將無法獲取服務提供者的地址列表,只能做本地單元測試或使用模擬樁測試。還有一種場景就是在實際測試中,服務提供者往往多實例部署,如果服務提供者存在Bug,就需要做遠程斷點調試,這會帶來兩個問題:1)服務提供者多實例部署,遠程調試地址無法確定,調試效率低下。2)多個消費者可能共用一套測試聯調環境,斷點調試過程中可能被其他消費者意外打斷。解決策略:繞過注冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直聯方式將以服務介面為單位,忽略注冊中心的提供者列表。3.3多團隊進度協同假如前端Web門戶依賴後台A、B、C和D4個服務,分別由4個不同的研發團隊負責,門戶要求新特性2周內上線。A和B內部需求優先順序排序將門戶的優先順序排的比較高,可以滿足交付時間點。但是C和D服務所在團隊由於同時需要開發其他優先順序更高的服務,因此把優先順序排的相對較低,無法滿足2周交付。在C和D提供版本之前,門戶只能先通過打測試樁的方式完成Mock測試,但是由於並沒有真實的測試過C和D服務,因此需求無法按期交付。應用依賴的服務越多,特性交付效率就越低下,交付的速度取決於依賴的最遲交付的那個服務。假如Web門戶依賴後台的100個服務,只要1個核心服務沒有按期交付,則整個進度就會延遲。解決方案:調用鏈可以將應用、服務和中間件之間的依賴關系串接並展示出來,基於調用鏈首入口的交付日期作為輸入,利用依賴管理工具,可以自動計算出調用鏈上各個服務的最遲交付時間點。通過調用鏈分析和標准化的依賴計算工具,可以避免人為需求排序失誤導致的需求延期。3.4服務降級和Mock測試在實際項目開發中,由於小組之間、個人開發者之間開發節奏不一致,經常會出現消費者等待依賴的服務提供者提供聯調版本的情況,相互等待會降低項目的研發進度。解決方案:服務提供者首先將介面定下來並提供給消費者,消費者可以將服務降級同Mock測試結合起來,在Mock測試代碼中實現容錯降級的業務邏輯(業務放通),這樣既完成了Mock測試,又實現了服務降級的業務邏輯開發,一舉兩得。3.5協同調試問題在實際項目開發過程中,各研發團隊進度不一致很正常。如果消費者坐等服務提供者按時提供版本,往往會造成人力資源浪費,影響項目進度。解決方案:分布式服務框架提供Mock樁管理框架,當周邊服務提供者尚未完成開發時,將路由切換到模擬測試模式,自動調用Mock樁;業務集成測試和上線時,則要能夠自動切換到真實的服務提供者上,可以結合服務降級功能實現。3.6介面前向兼容性由於線上的Bug修復、內部重構和需求變更,服務提供者會經常修改內部實現,包括但不限於:介面參數變化、參數欄位變化、業務邏輯變化和數據表結構變化。在實際項目中經常會發生服務提供者修改了介面或者數據結構,但是並沒有及時知會到所有消費者,導致服務調用失敗。解決方案:1)制定並嚴格執行《服務前向兼容性規范》,避免發生不兼容修改或者私自修改不通知周邊的情況。2)介面兼容性技術保障:例如Thrift的IDL,支持新增、修改和刪除欄位,欄位定義位置無關性,碼流支持亂序等。4.總結服務化之後,無論是服務化框架,還是業務服務,都面臨諸多挑戰,本章摘取了其中一些比較重要的問題,並給出解決方案和最佳實踐。對於本章節沒有列出的問題,則需要服務框架開發者和使用者在實踐中探索,找出一條適合自己產品的服務化最佳實踐。

⑦ 針對android的性能優化集中哪些方面

一、概要:

本文主要以Android的渲染機制、UI優化、多線程的處理、緩存處理、電量優化以及代碼規范等幾方面來簡述Android的性能優化

二、渲染機制的優化:

大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。

Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染, 如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。

*關於JobScheler的更多知識可以參考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html

七、代碼規范

1)for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。

2)明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)

3)合理使用數據類型,StringBuilder代替String,少用枚舉enum,少用父類聲明(List,Map)

4)如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。

5)你要知道單例的好處,並正確的使用它。

6)多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。

7)如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。

8)View中設置緩存屬性.setDrawingCache為true.

9)cursor的使用。不過要注意管理好cursor,不要每次打開關閉cursor.因為打開關閉Cursor非常耗時。Cursor.require用於刷cursor.

10)採用SurfaceView在子線程刷新UI,避免手勢的處理和繪制在同一UI線程(普通View都這樣做)

11)採用JNI,將耗時間的處理放到c/c++層來處理

12)有些能用文件操作的,盡量採用文件操作,文件操作的速度比資料庫的操作要快10倍左右

13)懶載入和緩存機制。訪問網路的耗時操作啟動一個新線程來做,而不要再UI線程來做

14)如果方法用不到成員變數,可以把方法申明為static,性能會提高到15%到20%

15)避免使用getter/setter存取field,可以把field申明為public,直接訪問

16)私有內部類要訪問外部類的field或方法時,其成員變數不要用private,因為在編譯時會生成setter/getter,影響性能。可以把外部類的field或方法聲明為包訪問許可權

17)合理利用浮點數,浮點數比整型慢兩倍

18)針對ListView的性能優化,ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能。ListView中getView是性能是關鍵,這里要盡可能的優化。

getView方法中要重用view;getView方法中不能做復雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的性能

19)不用new關鍵詞創建類的實例,用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。

clone()方法不會調用任何類構造函數。在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:

20)public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。

21)乘法和除法

考慮下面的代碼:

  • for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
    用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:
    for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

  • 22)ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。

    23)每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費

    24)提高下載速度:要控制好同時下載的最大任務數,同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)

    25)提供載入速度:讓服務端提供不同解析度的圖片才是最好的解決方案。還有合理使用內存緩存,使用開源的框架

    引用:Android性能優化的淺談

    ⑧ golang生成的json是格式化後的,有沒有提供方法壓縮一下

    innodb_data_home_dir = /longxibendi/mysql/mysql/var/
    #innodb_data_file_path = ibdata1:1G:autoextend
    innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend #表空間
    innodb_file_io_threads = 4 #io線程數

    ⑨ 如何打造高性能大數據分析平台

    1.大數據是什麼?
    大數據是最近IT界最常用的術語之一。然而對大數據的定義也不盡相同,所有已知的論點例如結構化的和非結構化、大規模的數據等等都不夠完整。大數據系統通常被認為具有數據的五個主要特徵,通常稱為數據的5 Vs。分別是大規模,多樣性,高效性、准確性和價值性。
    據Gartner稱,大規模可以被定義為「在本(地)機數據採集和處理技術能力不足以為用戶帶來商業價值。當現有的技術能夠針對性的進行改造後來處理這種規模的數據就可以說是一個成功的大數據解決方案。
    這種大規模的數據沒將不僅僅是來自於現有的數據源,同時也會來自於一些新興的數據源,例如常規(手持、工業)設備,日誌,汽車等,當然包括結構化的和非結構化的數據。
    據Gartner稱,多樣性可以定義如下:「高度變異的信息資產,在生產和消費時不進行嚴格定義的包括多種形式、類型和結構的組合。同時還包括以前的歷史數據,由於技術的變革歷史數據同樣也成為多樣性數據之一 「。
    高效性可以被定義為來自不同源的數據到達的速度。從各種設備,感測器和其他有組織和無組織的數據流都在不斷進入IT系統。由此,實時分析和對於該數據的解釋(展示)的能力也應該隨之增加。
    根據Gartner,高效性可以被定義如下:「高速的數據流I/O(生產和消費),但主要聚焦在一個數據集內或多個數據集之間的數據生產的速率可變上」。
    准確性,或真實性或叫做精度是數據的另一個重要組成方面。要做出正確的商業決策,當務之急是在數據上進行的所有分析必須是正確和准確(精確)的。
    大數據系統可以提供巨大的商業價值。像電信,金融,電子商務,社交媒體等,已經認識到他們的數據是一個潛在的巨大的商機。他們可以預測用戶行為,並推薦相關產品,提供危險交易預警服務,等等。
    與其他IT系統一樣,性能是大數據系統獲得成功的關鍵。本文的中心主旨是要說明如何讓大數據系統保證其性能。
    2.大數據系統應包含的功能模塊
    大數據系統應該包含的功能模塊,首先是能夠從多種數據源獲取數據的功能,數據的預處理(例如,清洗,驗證等),存儲數據,數據處理、數據分析等(例如做預測分析,生成在線使用建議等等),最後呈現和可視化的總結、匯總結果。
    下圖描述了大數據系統的這些高層次的組件:

    2.1各種各樣的數據源

    當今的IT生態系統,需要對各種不同種類來源的數據進行分析。這些來源可能是從在線Web應用程序,批量上傳或feed,流媒體直播數據,來自工業、手持、家居感測的任何東西等等。
    顯然從不同數據源獲取的數據具有不同的格式、使用不同的協議。例如,在線的Web應用程序可能會使用SOAP / XML格式通過HTTP發送數據,feed可能會來自於CSV文件,其他設備則可能使用MQTT通信協議。
    由於這些單獨的系統的性能是不在大數據系統的控制范圍之內,並且通常這些系統都是外部應用程序,由第三方供應商或團隊提供並維護,所以本文將不會在深入到這些系統的性能分析中去。
    2.2數據採集
    第一步,獲取數據。這個過程包括分析,驗證,清洗,轉換,去重,然後存到適合你們公司的一個持久化設備中(硬碟、存儲、雲等)。
    在下面的章節中,本文將重點介紹一些關於如何獲取數據方面的非常重要的技巧。請注意,本文將不討論各種數據採集技術的優缺點。
    2.3存儲數據
    第二步,一旦數據進入大數據系統,清洗,並轉化為所需格式時,這些過程都將在數據存儲到一個合適的持久化層中進行。
    在下面的章節中,本文將介紹一些存儲方面的最佳實踐(包括邏輯上和物理上)。在本文結尾也會討論一部分涉及數據安全方面的問題。
    2.4數據處理和分析
    第三步,在這一階段中的一部分干凈數據是去規范化的,包括對一些相關的數據集的數據進行一些排序,在規定的時間間隔內進行數據結果歸集,執行機器學習演算法,預測分析等。
    在下面的章節中,本文將針對大數據系統性能優化介紹一些進行數據處理和分析的最佳實踐。
    2.5數據的可視化和數據展示
    最後一個步驟,展示經過各個不同分析演算法處理過的數據結果。該步驟包括從預先計算匯總的結果(或其他類似數據集)中的讀取和用一種友好界面或者表格(圖表等等)的形式展示出來。這樣便於對於數據分析結果的理解。
    3.數據採集中的性能技巧
    數據採集是各種來自不同數據源的數據進入大數據系統的第一步。這個步驟的性能將會直接決定在一個給定的時間段內大數據系統能夠處理的數據量的能力。
    數據採集過程基於對該系統的個性化需求,但一些常用執行的步驟是 – 解析傳入數據,做必要的驗證,數據清晰,例如數據去重,轉換格式,並將其存儲到某種持久層。
    涉及數據採集過程的邏輯步驟示如下圖所示:

    下面是一些性能方面的技巧:

    ●來自不同數據源的傳輸應該是非同步的。可以使用文件來傳輸、或者使用面向消息的(MoM)中間件來實現。由於數據非同步傳輸,所以數據採集過程的吞吐量可以大大高於大數據系統的處理能力。 非同步數據傳輸同樣可以在大數據系統和不同的數據源之間進行解耦。大數據基礎架構設計使得其很容易進行動態伸縮,數據採集的峰值流量對於大數據系統來說算是安全的。
    ●如果數據是直接從一些外部資料庫中抽取的,確保拉取數據是使用批量的方式。
    ●如果數據是從feed file解析,請務必使用合適的解析器。例如,如果從一個XML文件中讀取也有不同的解析器像JDOM,SAX,DOM等。類似地,對於CSV,JSON和其它這樣的格式,多個解析器和API是可供選擇。選擇能夠符合需求的性能最好的。
    ●優先使用內置的驗證解決方案。大多數解析/驗證工作流程的通常運行在伺服器環境(ESB /應用伺服器)中。大部分的場景基本上都有現成的標准校驗工具。在大多數的情況下,這些標準的現成的工具一般來說要比你自己開發的工具性能要好很多。
    ●類似地,如果數據XML格式的,優先使用XML(XSD)用於驗證。
    ●即使解析器或者校等流程使用自定義的腳本來完成,例如使用java優先還是應該使用內置的函數庫或者開發框架。在大多數的情況下通常會比你開發任何自定義代碼快得多。
    ●盡量提前濾掉無效數據,以便後續的處理流程都不用在無效數據上浪費過多的計算能力。
    ●大多數系統處理無效數據的做法通常是存放在一個專門的表中,請在系統建設之初考慮這部分的資料庫存儲和其他額外的存儲開銷。
    ●如果來自數據源的數據需要清洗,例如去掉一些不需要的信息,盡量保持所有數據源的抽取程序版本一致,確保一次處理的是一個大批量的數據,而不是一條記錄一條記錄的來處理。一般來說數據清洗需要進行表關聯。數據清洗中需要用到的靜態數據關聯一次,並且一次處理一個很大的批量就能夠大幅提高數據處理效率。
    ●數據去重非常重要這個過程決定了主鍵的是由哪些欄位構成。通常主鍵都是時間戳或者id等可以追加的類型。一般情況下,每條記錄都可能根據主鍵進行索引來更新,所以最好能夠讓主鍵簡單一些,以保證在更新的時候檢索的性能。
    ●來自多個源接收的數據可以是不同的格式。有時,需要進行數據移植,使接收到的數據從多種格式轉化成一種或一組標准格式。
    ●和解析過程一樣,我們建議使用內置的工具,相比於你自己從零開發的工具性能會提高很多。
    ●數據移植的過程一般是數據處理過程中最復雜、最緊急、消耗資源最多的一步。因此,確保在這一過程中盡可能多的使用並行計算。
    ●一旦所有的數據採集的上述活動完成後,轉換後的數據通常存儲在某些持久層,以便以後分析處理,綜述,聚合等使用。
    ●多種技術解決方案的存在是為了處理這種持久(RDBMS,NoSQL的分布式文件系統,如Hadoop和等)。
    ●謹慎選擇一個能夠最大限度的滿足需求的解決方案。
    4.數據存儲中的性能技巧
    一旦所有的數據採集步驟完成後,數據將進入持久層。
    在本節中將討論一些與數據數據存儲性能相關的技巧包括物理存儲優化和邏輯存儲結構(數據模型)。這些技巧適用於所有的數據處理過程,無論是一些解析函數生的或最終輸出的數據還是預計算的匯總數據等。
    ●首先選擇數據範式。您對數據的建模方式對性能有直接的影響,例如像數據冗餘,磁碟存儲容量等方面。對於一些簡單的文件導入資料庫中的場景,你也許需要保持數據原始的格式,對於另外一些場景,如執行一些分析計算聚集等,你可能不需要將數據範式化。
    ●大多數的大數據系統使用NoSQL資料庫替代RDBMS處理數據。
    ●不同的NoSQL資料庫適用不同的場景,一部分在select時性能更好,有些是在插入或者更新性能更好。
    ●資料庫分為行存儲和列存儲。
    ●具體的資料庫選型依賴於你的具體需求(例如,你的應用程序的資料庫讀寫比)。
    ●同樣每個資料庫都會根據不同的配置從而控制這些資料庫用於資料庫復制備份或者嚴格保持數據一致性。
    ●這些設置會直接影響資料庫性能。在資料庫技術選型前一定要注意。
    ●壓縮率、緩沖池、超時的大小,和緩存的對於不同的NoSQL資料庫來說配置都是不同的,同時對資料庫性能的影響也是不一樣的。
    ●數據Sharding和分區是這些資料庫的另一個非常重要的功能。數據Sharding的方式能夠對系統的性能產生巨大的影響,所以在數據Sharding和分區時請謹慎選擇。
    ●並非所有的NoSQL資料庫都內置了支持連接,排序,匯總,過濾器,索引等。
    ●如果有需要還是建議使用內置的類似功能,因為自己開發的還是不靈。
    ●NoSQLs內置了壓縮、編解碼器和數據移植工具。如果這些可以滿足您的部分需求,那麼優先選擇使用這些內置的功能。這些工具可以執行各種各樣的任務,如格式轉換、壓縮數據等,使用內置的工具不僅能夠帶來更好的性能還可以降低網路的使用率。
    ●許多NoSQL資料庫支持多種類型的文件系統。其中包括本地文件系統,分布式文件系統,甚至基於雲的存儲解決方案。
    ●如果在互動式需求上有嚴格的要求,否則還是盡量嘗試使用NoSQL本地(內置)文件系統(例如HBase 使用HDFS)。
    ●這是因為,如果使用一些外部文件系統/格式,則需要對數據進行相應的編解碼/數據移植。它將在整個讀/寫過程中增加原本不必要的冗餘處理。
    ●大數據系統的數據模型一般來說需要根據需求用例來綜合設計。與此形成鮮明對比的是RDMBS數據建模技術基本都是設計成為一個通用的模型,用外鍵和表之間的關系用來描述數據實體與現實世界之間的交互。
    ●在硬體一級,本地RAID模式也許不太適用。請考慮使用SAN存儲。
    5.數據處理分析中的性能技巧
    數據處理和分析是一個大數據系統的核心。像聚合,預測,聚集,和其它這樣的邏輯操作都需要在這一步完成。
    本節討論一些數據處理性能方面的技巧。需要注意的是大數據系統架構有兩個組成部分,實時數據流處理和批量數據處理。本節涵蓋數據處理的各個方面。
    ●在細節評估和數據格式和模型後選擇適當的數據處理框架。
    ●其中一些框架適用於批量數據處理,而另外一些適用於實時數據處理。
    ●同樣一些框架使用內存模式,另外一些是基於磁碟io處理模式。
    ●有些框架擅長高度並行計算,這樣能夠大大提高數據效率。
    ●基於內存的框架性能明顯優於基於磁碟io的框架,但是同時成本也可想而知。
    ●概括地說,當務之急是選擇一個能夠滿足需求的框架。否則就有可能既無法滿足功能需求也無法滿足非功能需求,當然也包括性能需求。
    ●一些這些框架將數據劃分成較小的塊。這些小數據塊由各個作業獨立處理。協調器管理所有這些獨立的子作業
    ●在數據分塊是需要當心。
    ●該數據快越小,就會產生越多的作業,這樣就會增加系統初始化作業和清理作業的負擔。
    ●如果數據快太大,數據傳輸可能需要很長時間才能完成。這也可能導致資源利用不均衡,長時間在一台伺服器上運行一個大作業,而其他伺服器就會等待。
    ●不要忘了查看一個任務的作業總數。在必要時調整這個參數。
    ●最好實時監控數據塊的傳輸。在本機機型io的效率會更高,這么做也會帶來一個副作用就是需要將數據塊的冗餘參數提高(一般hadoop默認是3份)這樣又會反作用使得系統性能下降。
    ●此外,實時數據流需要與批量數據處理的結果進行合並。設計系統時盡量減少對其他作業的影響。
    ●大多數情況下同一數據集需要經過多次計算。這種情況可能是由於數據抓取等初始步驟就有報錯,或者某些業務流程發生變化,值得一提的是舊數據也是如此。設計系統時需要注意這個地方的容錯。
    ●這意味著你可能需要存儲原始數據的時間較長,因此需要更多的存儲。
    ●數據結果輸出後應該保存成用戶期望看到的格式。例如,如果最終的結果是用戶要求按照每周的時間序列匯總輸出,那麼你就要將結果以周為單位進行匯總保存。
    ●為了達到這個目標,大數據系統的資料庫建模就要在滿足用例的前提下進行。例如,大數據系統經常會輸出一些結構化的數據表,這樣在展示輸出上就有很大的優勢。
    ●更常見的是,這可能會這將會讓用戶感覺到性能問題。例如用戶只需要上周的數據匯總結果,如果在數據規模較大的時候按照每周來匯總數據,這樣就會大大降低數據處理能力。
    ●一些框架提供了大數據查詢懶評價功能。在數據沒有在其他地方被使用時效果不錯。
    ●實時監控系統的性能,這樣能夠幫助你預估作業的完成時間。
    6.數據可視化和展示中的性能技巧
    精心設計的高性能大數據系統通過對數據的深入分析,能夠提供有價值戰略指導。這就是可視化的用武之地。良好的可視化幫助用戶獲取數據的多維度透視視圖。
    需要注意的是傳統的BI和報告工具,或用於構建自定義報表系統無法大規模擴展滿足大數據系統的可視化需求。同時,許多COTS可視化工具現已上市。
    本文將不會對這些個別工具如何進行調節,而是聚焦在一些通用的技術,幫助您能打造可視化層。
    ●確保可視化層顯示的數據都是從最後的匯總輸出表中取得的數據。這些總結表可以根據時間短進行匯總,建議使用分類或者用例進行匯總。這么做可以避免直接從可視化層讀取整個原始數據。
    ●這不僅最大限度地減少數據傳輸,而且當用戶在線查看在報告時還有助於避免性能卡頓問題。
    ●重分利用大化可視化工具的緩存。緩存可以對可視化層的整體性能產生非常不錯的影響。
    ●物化視圖是可以提高性能的另一個重要的技術。
    ●大部分可視化工具允許通過增加線程數來提高請求響應的速度。如果資源足夠、訪問量較大那麼這是提高系統性能的好辦法。
    ●盡量提前將數據進行預處理,如果一些數據必須在運行時計算請將運行時計算簡化到最小。
    ●可視化工具可以按照各種各樣的展示方法對應不同的讀取策略。其中一些是離線模式、提取模式或者在線連接模式。每種服務模式都是針對不同場景設計的。
    ●同樣,一些工具可以進行增量數據同步。這最大限度地減少了數據傳輸,並將整個可視化過程固化下來。
    ●保持像圖形,圖表等使用最小的尺寸。
    ●大多數可視化框架和工具的使用可縮放矢量圖形(SVG)。使用SVG復雜的布局可能會產生嚴重的性能影響。
    7.數據安全以及對於性能的影響
    像任何IT系統一樣安全性要求也對大數據系統的性能有很大的影響。在本節中,我們討論一下安全對大數據平台性能的影響。
    – 首先確保所有的數據源都是經過認證的。即使所有的數據源都是安全的,並且沒有針對安全方面的需求,那麼你可以靈活設計一個安全模塊來配置實現。
    – 數據進過一次認證,那麼就不要進行二次認證。如果實在需要進行二次認證,那麼使用一些類似於token的技術保存下來以便後續繼續使用。這將節省數據一遍遍認證的開銷。
    – 您可能需要支持其他的認證方式,例如基於PKI解決方案或Kerberos。每一個都有不同的性能指標,在最終方案確定前需要將其考慮進去。
    – 通常情況下數據壓縮後進入大數據處理系統。這么做好處非常明顯不細說。
    – 針對不同演算法的效率、對cpu的使用量你需要進行比較來選出一個傳輸量、cpu使用量等方面均衡的壓縮演算法。
    – 同樣,評估加密邏輯和演算法,然後再選擇。
    – 明智的做法是敏感信息始終進行限制。
    – 在審計跟蹤表或登錄時您可能需要維護記錄或類似的訪問,更新等不同的活動記錄。這可能需要根據不同的監管策略和用戶需求個性化的進行設計和修改。
    – 注意,這種需求不僅增加了數據處理的復雜度,但會增加存儲成本。
    – 盡量使用下層提供的安全技術,例如操作系統、資料庫等。這些安全解決方案會比你自己設計開發性能要好很多。
    8.總結
    本文介紹了各種性能方面的技巧,這些技術性的知道可以作為打造大數據分析平台的一般准則。大數據分析平台非常復雜,為了滿足這種類型系統的性能需求,需要我們從開始建設的時候進行考量。
    本文介紹的技術准則可以用在大數據平台建設的各個不同階段,包括安全如何影響大數據分析平台的性能。

    閱讀全文

    與json壓縮演算法相關的資料

    熱點內容
    怎麼提前看未播出的電視劇app 瀏覽:664
    cad轉pdf圖層 瀏覽:598
    程序員接私活初級 瀏覽:431
    全無油潤滑壓縮機 瀏覽:183
    代碼加密常用方法 瀏覽:952
    安卓手機如何解除已禁用 瀏覽:396
    演算法的隨機性 瀏覽:485
    高中解壓體育游戲 瀏覽:533
    androidstudior丟失 瀏覽:345
    命令行筆記 瀏覽:738
    360目標文件夾訪問拒絕 瀏覽:519
    3b編程加工指令 瀏覽:789
    c8051f系列單片機選型手冊 瀏覽:773
    南昌php程序員 瀏覽:512
    bcs命令 瀏覽:446
    如何在伺服器指向域名 瀏覽:417
    車床編程可以做刀嗎 瀏覽:519
    ln命令源碼 瀏覽:792
    用粘液做解壓手套 瀏覽:331
    icloud收信伺服器地址 瀏覽:500