什么是大文件?大型文件是由于計算機內存不足而無法同時讀取的文件。在這種情況下,直接使用桌面數據工具(如 Excel)是無能為力的,通常需要編寫一個程序來處理它。即使程序已寫入,也必須分批讀取大型文件進行計算和處理。最后,需要根據不同的計算類型對批處理結果進行適當匯總,比小文件的處理要復雜得多。有許多類型的大文件,如文本文件、Excel 文件、XML 文件、JSON 文件、HTTP 文件。其中,文本(txt 或 CSV)是最常見的。

可用于處理大型文件的程序語言如下:
1. 傳統的高級編程語言,如Java、C/C++、C#、基本等。
2. 文件數據導入數據庫,由 SQL 處理
3. Python
4. esproc Spl

本文以文本文件為例,介紹了上述大文件計算方法的特點。對于其他類型的文件,除了讀取數據的方式不同外,讀取后的處理思路與文本文件類似。

本文訂單中使用的文件有五.txt:訂單鍵、訂單日期、狀態、數量和數量。該列由選項卡分隔。文件中的第一行是列名,共有 1000 萬行數據。如下:

I. 高級語言(以 Java 為例)

使用高級語言編程進行計算,如何編寫計算過程與特定的計算類型有關。不同類型的計算需要不同的計算過程。讓我們來看看最簡單的聚合計算,例如計算訂單中的金額.txt。它用 Java 編寫如下:

Java

 

1
緩沖閱讀器 brbr= 新的new緩沖閱讀器(新的new輸入流閱讀器新的Fileinputstream("訂單.txt" new
2
字符串字段名稱=br。讀取行() 。拆分(\t"
3
總和=0
4
字符串=
5
=br.讀取行()! =
字符串= 值values= 。拆分“\t”);

7
浮動金額= 浮動。解析浮 (=4+ );?// 假設第 5 列稱為金額
8
總和=金額
9
  }

此程序是一次讀取一行數據,文件訪問需要太多的時間,運行速度很慢。如果要運行得更快,則需要一次讀取大量數據塊(如 10000 行),然后使用代碼將數據拆分為處理行,這將非常麻煩。

這是最簡單的計算,沒有數據篩選、分組、排序和其他要求。平均值、最大值和最小值的其他計算與此類似。

如果要執行組聚合,代碼將更麻煩。例如,按狀態分組后,計算每個狀態的總訂單量。計算思路如下:保存每個組,然后按行讀取每行的狀態值。與已保存的組進行比較,如果找到,請將此行的訂單量添加到組中;如果找到,請將行的訂單量添加到組中。如果沒有,請添加新組;直到處理所有行

排序比較麻煩,需要中間緩存文件。例如,如果要對訂單量從大到小進行排序,則由于內存不足,無法讀取要排序的所有數據。計算思路如下:讀取 5000 行數據(要讀取的行數取決于內存),對它們進行排序并保存到臨時文件中,然后讀取 5000 行以排序并保存到另一個臨時文件,直到處理所有數據。最后,這些臨時文件以有序的方式合并 – 讀取每個臨時文件的第一行,找出哪一行應該在頂部,將其寫入結果文件,然后從臨時文件中讀取另一行,繼續比較并找到寫入結果文件的第一行。在將所有數據行寫入結果文件之前,請進行此操作。

使用高級語言處理大型文件非常繁瑣,這對于專業程序員來說幾乎是不可能的。

二. 使用數據庫

數據庫中內置了許多計算算法,數據查詢和計算比較完善,性能也比較好。因此,可以考慮將大文件導入數據庫,生成數據庫表,然后使用 SQL 查詢和計算數據。

此方法的麻煩是將文件導入數據庫。在導入數據之前,需要創建表結構并指定每列的數據類型。例如,用于創建訂單表的 SQL 如下所示:

Sql

 

x
1
1
創建整數為空
2
  日期為空
3
  狀態字符(20為空,
4
  數量整數不為,
5
進制(15,2不為空)
6
  

如果更改為具有其他結構的另一個數據文件,則需要編寫另一個 SQL 來創建表。特別是,您需要指定數據類型,否則數據庫將不能接受數據,這是非常不熟悉的許多沒有專業程序員。

對于導入過程,數據庫通常提供直接導入文本文件的工具,而其他文件不能直接導入,并且需要首先將其轉換為文本文件。Excel 文件可以直接保存為文本,但對于 XML 文件、JSON 文件、HTTP 文件等,需要編寫程序以將其轉換為文本文件,或者編寫程序以在文件中讀取、生成 SQL 語句以及將數據寫入數據庫表。不管怎樣,這是一件很乏味的事情。

數據存儲在數據庫表中后,查詢和計算確實非常簡單,分組和排序也非常簡單。示例如下:

1. 計算總訂單金額

Java

 

x
1
1
選擇總和訂單金額orders;

2. 按州分組并按狀態計算總訂單金額

Java

 

x
1
 
1

3. 按訂單金額排序

Java

 

x
1
 
1
金額從訂單orders訂單中選擇 *;

使用數據庫查詢和計算大量數據非常方便,但將大文件導入數據庫非常復雜,有一定的專業技能要求

三. Python

Python 不提供直接處理大型文件的語法。其實現理念與高級語言類似。例如,上一節中計算的訂單金額之和寫如下:

Java

 

x
1
 
1
總和=0
2
打開("訂單

9896px;">

3
真實
4
=f.讀行
5
如果不是not
6
中斷
7
sumAmount= 浮動.拆分"\t") =4
8
打印蘇馬蒙特

對于復雜的操作,如分組和排序,如果我們實現上述的想法,Python也是非常麻煩的,這不像Java簡單多少 如果是可讀入內存的小文件,則很容易處理。不幸的是,熊貓沒有為大文件提供直接的批處理方法,所以我們必須自己編寫程序。使用大熊貓的復雜性比直接硬寫要小得多,但上面討論的想法仍需要落實。

編寫分組操作太麻煩了。讓我們寫基于熊貓的總和操作來感受它。

Java

 

x
1
 
1
導入熊貓作為pd
2
read_csv("訂單.txt",sep="\t",標題=無,大小 =100000)None

3
總和=0
4
用于chunk_datachunk_data
5
總和 ==4= 。總和
6
打印蘇馬蒙特

使用熊貓后,文本可以視為結構化數據一行一排,不再需要自己拆分。

Python 對小文件沒有大問題,但它不能為大型文件提供有效的支持。與高級語言相比,減少的工作負載非常有限,可用性不高,而且沒有數據庫好

IV. esProc SPL

esProc 是一種專業的數據處理工具。與數據庫一樣,它具有內置的查詢和計算算法。它可以直接使用文本、Excel、XML、JSON、etc.to文件,而無需導入數據。

esProc 提供了一個游標,它可以分批讀取數據,然后計算,因此處理大型文件非常方便。與上例一樣,您只需要一行代碼:

1. 計算總訂單金額

Java

 

x
1
 
1
?文件("訂單.txt"。光標@t()。總和))
Java

 

x
1
 
1
?文件("訂單.txt"。光標@t()。選擇訂單日期>=日期"2009-01-01" ))。總和))

分組和排序也很簡單:

2txt") .cursor@t組 () 組 (狀態; 總和 (金額) 的數據 lang = "文本 / x - java" >

x
1
 
1
?文件("訂單.txt"。光標@t()。組(狀態;(金額))

3. 按訂單金額排序

Java

 

x
1
 
1
?文件("訂單.txt"。光標@t()。排序 (金額

esProc 甚至允許您直接使用 SQL 查詢文件。例如,前面三個示例編寫如下:

Java

 

x
1

1
$select(sum來自"訂單.txt金額"
Java

 

x
1
 
1
(按州)

Java

 

x
1
 
1
$select"訂單.txt"訂單(按金額
Java

 

x
1
 
1
?文件("訂單.txt"。光標@tm(;4)。組(狀態;(金額))

它將以4向并行模式計算,在普通多核筆記本電腦上速度可提高2~3倍 Python 基本上不能實現并行。SQL 取決于數據庫??梢詫I數據庫(如 Oracle)實現并行,但對 MySQL 等簡單數據庫則不實現并行。

Comments are closed.