2 个版本

0.1.1 2022年6月6日
0.1.0 2020年2月27日

#1142 in 数据库接口


用于 liquid-ml

MIT 许可证

180KB
898

SoRer

SoRer,即 schema-on-read-er 的缩写,是一个库,可以推断模式,根据模式将 .sor 文件解析为列表示形式,并处理缺失数据和(大多数情况下)格式错误的数据。

SoRer 考虑了速度和内存效率,文件解析是线程化的。

在我们的两年旧台式机上(一个 SATA SSD,意味着我们的测试可能接近由 SSD 读取速度限制),4 个核心(4 个线程),SoRer 在一个包含 8 列、每种数据类型有两个随机值的大型测试文件上可以解析到约 400 MB/s。通过运行 cargo run --release --bin generate(警告:不要在 Docker 中执行此操作,如果您想执行此操作,则必须安装 rust,因为使用 Docker 时文件 I/O 有开销)。在最佳情况下,在一个包含 3 列随机布尔值的大型文件上,它可以解析到超过 700 MB/s

用法

构建 SoRer

SoRer 可以通过在仓库根目录下运行命令 make docker 在任何计算机上构建。这将构建一个标记为 sorer 的 Docker 镜像。它还构建了 sorer 的可执行文件,位于 /sorer/target/release/sorer,并将可执行文件复制到当前目录。

可以通过运行命令 make test 运行测试。可以通过运行命令 make run 使用名为 sor.txt 的小型测试文件运行程序。

可以通过运行命令 make doc 来构建文档。这将在当前目录的宿主文件系统中将文档复制到 ./doc/。您可以通过在浏览器中打开 ./doc/sorer/index.html 来查看此文档。

请注意,由于使用 Docker 的开销(尤其是在 Windows 或 Mac 上),理想情况下运行我们的程序的最佳方式是裸机。您可以通过运行以下命令来安装 rust

curl --proto '=https' --tlsv1.2 -sSfhttps://sh.rustup.rs | sh

安装后,请遵循打印的说明来设置 cargo 环境变量。

然后,通过运行以下命令来构建 sorer

SoRer 的运行

SoRer 作为命令行工具运行,将结果打印到 stdout

以下表格总结了命令行参数

参数 值类型 是否必需? 描述
-f <string> SoR 文件的路径
-from <uint> 文件中的起始位置(以字节为单位)
-len <uint> 要读取的字节数
-print_col_type <uint> 依赖于 打印列的类型:BOOL,INT,FLOAT,STRING
-print_col_idx <uint> <uint> 依赖于 第一个参数是列,第二个是偏移量
-is_missing_idx <uint> <uint> 依赖于 在指定的列偏移量中是否有缺失的字段

<val>-from <val> 中的值大于 0 时,文件将从 <val> 后的第一行完整内容开始读取。

<val>-len <val> 中的值大于 0 时,文件将读取到最后一行完整内容。

运行 make build 后,再运行 make bash 将将当前目录挂载到docker容器中并启动bash。如果您想测试任何大文件,您应该先运行 make build,然后将文件复制到该目录中,然后运行 make bash。一旦进入bash,您可以像往常一样与 sorer 交互

SoR 文件

SoR 文件以纯文本形式存储。文件由一系列行组成,每行必须由换行符 "\n" 分隔。每行是一个字段的序列,每个字段以 "<" 开头,以 ">" 结尾。分隔符周围的空格将被忽略。

SoR 字段

字段可以没有值,或者包含四种 SoR 类型之一的价值

  • 字符串
  • 浮点数
  • 整数
  • 布尔值
类型 允许的值
字符串 可以是字符序列(不含空格)或以双引号分隔的字符序列(含空格)。字符串中不允许换行符。长度不能超过255个字符。必须是有效的 utf-8 字符。
浮点数 任何 C++ 浮点数
整数 任何 C++ 整数,即一个带可选前导符号的数字序列(不能由空白字符分隔)
布尔值 {1, 0}
缺失(即空值) 必须为空,即 "<>"

SoR 字段的有效示例

以下是一个包含四个字段的行的示例

< 1 > <hi>< +2.2 > < "bye">

以下是一个包含显式缺失字段的行的示例

<1> <bye> <> <>

以下也是有效的

<> <> <> <>

SoR 字段的不正确示例

<1. 2>       // space after dot

<bye world>  // string with spaces and without quotes

<+ 1>        // space after the +

注意:如果 SoR 文件包含无效字段,则该行将在模式和数据处理过程中被丢弃。

模式推断

SoRer 生成的模式取决于包含在具有最多字段数的前100行中的数据类型,然后是文件中点的100行,最后是最后的100行(或先到达的整个文件)。在 sorer 示例中,这些行将不考虑 --from 命令行参数。模式中每列的数据类型是所有等于最宽行宽度的行中看到的最优先级数据类型。

数据类型优先级如下

  1. 字符串
  2. 浮点数
  3. 整数
  4. 布尔值

这意味着如果任何值是 String,则整个列将解析为 String 类型。否则,如果任何值是 Float,则该列是 Float 类型。否则,如果您找到一个带有符号或大于 1 的值的值,则该列是 Integer 类型。否则,该列是 Bool 类型,即使只有显式的 'missing' 没有数据。

不符合模式的行

如果在推断模式之后(即第一次500行之后)发现不匹配模式的行,则该行将被丢弃。例如,如果模式被解析为<int> <int>,但之后的第一行是<string> <int>,则它将被丢弃。

但是请注意,同一文件中的两行可以具有不同数量的字段,但仍被认为是与模式匹配。对于具有比模式更多字段的行,将丢弃额外的字段,但只要其他字段与模式匹配,行仍然会被解析。

例如,模式:<int> <bool> 和行:<12> <0> <discarded> 解析为 <12><0>

如果一个行有少于字段而没有显式缺失的字段(即“<>”),也就是隐式缺失字段,SoRer 将尝试根据模式解析字段,并在行的末尾填充显式缺失的字段,直到它匹配模式的字段数。

例如,模式:<int> <bool> <string> 和行:<12> 解析为 <12><><>

pub 模块 dataframe; pub 模块 parsers; pub 模块 schema;

依赖关系

~1.9–2.7MB
~55K SLoC