【性能优化】2.1 [外存数据集] 文本文件分段

 

【性能优化】1.5 [内存查找] 多层序号定位

2.1 文本文件分段

性能问题常常都和数据量大相关,而大数据通常不能在内存中放下,我们要考虑外存数据的运算方案。数据库可能是最常见的外存数据存储方案,但我们无法在数据库中实施优化的存储方法和算法,因此也没必要去研究这种场景了。

考虑到工程可实施性,我们这里将讨论存储在文件系统中的外存数据。

文本文件是一种很常见的文件格式。因它简单通用,常常被用作各种数据系统之间交换数据的媒介。用于存储结构化数据的文本文件通常会有一行标题标识字段名,每行是一条记录,行内的字段之间用制表符或逗号分隔,行之间用回车符分隔。

文本文件的存储方案已经固定,提高其运算性能的主要手段就只有并行。现代计算机通常都有多个 CPU,如果能够并行计算则能获得几乎线性倍数的性能提升。

要实施并行,需要能将文件分段,让每个线程(CPU)分别处理其中某一段。对于文本文件这种每行长度不同的文件格式,不能内存那样可以使用记录序号(即行数)来分段,要取到第 n 行文本,需要把前 n-1 行都遍历一遍,这完全就失去提高性能的意义了。而且,甚至我们都无法知道事先文件中总共有多少行。

对文本文件的分段要采用字节位置定位的方法,操作系统能够直接返回整个文件的字节数,也提供有快速定位到文件中指定字节位置的方法。但某个字节位置并不一定是行的开始(大概率不是),直接从这里读取,会得到半行记录。

文本文件中用回车符作为行(也就是记录)的分隔符,而行(记录)本身中不会出现回车符。利用这个特征,可以使用去头补尾的方法来实现文本文件随机读取。即从指定的字节位置开始,读到回车符后,才认为记录开始,读到下一个回车符的时候会得到一条完整的行(记录)。第一个回车符之前的读出的字符将被丢弃掉,即去头;如果某一段要求读到某个指定字节位置就要结束,那么实际上会超过这个字节位置直到再出现一个回车符,保证读到的行(记录)的完整性,即补尾。

SPL 内置了文本文件的分段读取方法,指明总分段数和第几段即可。


A

B

C

1

=file("data.txt")

2

=A1.cursor@t(;4:10)

=A1.cursor@t(;5:10)

=A1.cursor@t(;23:100)

3

=A2.fetch(1)

=B2.fetch(100)

=C2.fetch()

A2、B2、C2 分别定义了三个游标。A2 将文件分成 10 段,取第 4 段;B2 取第 5 段;C2 则将文件分成了 100 段取第 23 段。然后在 A3、B3、C3 分别读出一些记录。

用这种去头补尾的方法对文本文件分段,不能保证每个段的记录数相同,只能保证每一段的字节数相对平均。

【性能优化】2.2 [外存数据集] 集文件及倍增分段
【性能优化】 前言及目录