什么是大文件?大型文件是由于计算机内存不足而无法同时读取的文件。在这种情况下,直接使用桌面数据工具(如 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
进制(152不为空)
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 取决于数据库。可以对专业数据库(如 Oracle)实现并行,但对 MySQL 等简单数据库则不实现并行。

Comments are closed.