为什么固定宽度的文件格式仍在使用?

时间:2011-10-05 19:41:05

标签: xml fixed-width

对于像XML这样的固定宽度文件格式有什么优势吗?我意识到XML可能会占用更多的磁盘空间来存储相同数量的数据,但文件也可以被压缩。从理论上讲,我猜你也可以根据它在文件中的位置读取一段特定的数据(只需抓取那些字节)。但除此之外,还有什么?

6 个答案:

答案 0 :(得分:21)

当数据很大(Giga / Terra-bytes)时,固定宽度格式文件可以 MUCH 更高效。

由于每个记录和字段都有固定的大小,您可以简单地寻找(例如)第n百万行并从那里读取几个记录。您还可以将整个文件内存映射到内存中,并获得相当高效且随意的随机访问。

XML文件不适合这些情况。

答案 1 :(得分:7)

XML很复杂。特别是如果您根据架构进行验证。这可能看起来不重要,因为其他人已经编写了可以使用的XML解析器。但这会增加很多处理,这意味着它需要更长的时间。在许多情况下这可能不是问题,但有时可以。

如果要将一个整数保存为自定义文件格式,只需要4个字节,当您要加载它时,只需将这4个字节复制到内存中(假设文件格式和平台具有相同的字节顺序) 。但是使用XML,可能需要10-30个字节。加载它意味着比较字符串和解析整数的十进制表示,可能更多。

同样,那些性能和存储大小的差异可能对你甚至考虑来说太微不足(并且设计自定义格式所需的工作可能非常重要),但在很多情况下,这些差异事。

例如,我遇到了一个使用SMS消息传输某些数据的系统。这意味着每条消息有140个字节(!)。发送和接收这些消息的设备没有GB的内存和GHz的CPU。在这种情况下,您确保每个都很重要,并且您当然不会使用XML。

答案 2 :(得分:5)

我知道这是旧的,但我每天都处理固定宽度和XML。您可以将其总结为:

XML =可读性

固定宽度=速度和低资源消耗

XML主要是为了人类的可读性。我不在乎任何人对结构和验证的看法。如果您正在运行一个真正不需要的系统并且应该让人类阅读您来回传递的文件,那么您实际上只是将其作为开销添加到它所花费的时间量上。处理文件和文件的大小,影响文件传输内容所需的时间以及对处理的另一个影响。所有这些也将影响消耗XML文件的系统的内存使用。 然而,XML有一些优点。您可以更松散地定义您的结构。如果您的文件和代码都不要求字段长度为255个字符,则有时会更容易。只有您的代码加载了限制期限。 另一个优点是XML可以/应该带有一个定义XML内容要求的XML Schema。这有助于拥有使用单个API的多个系统。如果您可以向开发人员提供架构,他们可以非常快速地将类型化对象序列化为适当的格式化和结构化XML。

固定宽度用于速度和最小的资源消耗。设置比XML更繁琐。确保所有系统都知道"列的准确位置。在固定宽度文件中。通常并非所有系统都使用相同或所有列,因此您最终只能使用一个完全了解固定宽度内容的系统。这可能会使利用传输的文件内容扩展API或系统变得具有挑战性。但是,由于没有字段标签,没有标签,只有原始数据,您通常可以通过网络发送更小的包。并非总是如此,在某些情况下,您可能会有大量文本字段,这些字段通常会在字段中存储少量数据,但对于输入段落长度的一个关闭情况,必须保留较大的列宽。现在,你的固定宽度文件中有一堆空格占据位置,而XML实际上可能会缩小整体包装尺寸。

一般来说,XML是为了便于阅读。您通常只能选择固定宽度文件甚至是CSV文件,并立即开始掌握数据的含义。如果标记为XML文件,您也可以。

我没有涉及到许多优点和缺点,但这是我看到差异真正的肉和土豆的地方。

答案 3 :(得分:2)

可能主要是出于遗留原因,因为XML,JSON(等)的解析器几乎存在于所有平台上。

理论上固定宽度的格式可以更节省空间,正如您所建议的那样;阅读比较简单。但这些似乎并没有显着的好处。

对于它的价值,像CSV这样的表格(但不是固定宽度)格式有其用途,结合了更紧凑的表示和可能更好的可读性; CSV非常适合地图/缩小样式作业。

答案 4 :(得分:2)

在我意识到固定宽度的力量之前,我也有同样的问题。我们有一个表有数百万条记录将它们提取到文件中,因为JSON将文件大小扩大到15GB和2 + hrs。使用固定的widht使其降至6.5GB和15分钟。

提取和写入固定宽度比JSON快。

我也试过了CSV,即使在这里固定宽度得分也更高。

答案 5 :(得分:1)

一个原因可能是处理XML(不仅仅是读取和加载到内存结构中,而是考虑在XML文件中进行正则表达式搜索而不是简单的固定宽度或分隔文件,甚至对错误数据进行手动快速修复)比固定宽度的文件更复杂。当然,有很多库可以为你做这件事,但是如果没有你正在使用的平台,你真的想写一个XML解析器,或者只是读取 n的程序吗?位于 x 字节?