与 XML 相比,固定宽度的文件格式有什么优势吗?我意识到 XML 可能会占用更多磁盘空间来存储相同数量的数据,但文件也可以被压缩。我想您理论上也可以根据文件中的位置读取特定的数据(只需获取这些字节)。但除此之外,还有什么?
6 回答
当数据很大(Giga/Terra-bytes)时,固定宽度格式的文件效率更高。
由于每个记录和字段都有固定的大小,您可以简单地查找(例如)第 n 百万行并从那里读取几条记录。您还可以将整个文件内存映射到内存中,并对所有内容进行相当高效和轻松的随机访问。
XML 文件不适合这些情况。
XML is complicated. And especially if you do validation according to a schema. This may not look important, because somebody else already wrote XML parser that you can use. But this adds quite a lot of processing, which means it takes longer. This may not be a problem in many cases, but sometimes can.
If you want to save one integer into a custom file format, it takes just 4 bytes and when you want to load it, you just copy those 4 bytes into memory (assuming the file format and your platform have the same endianness). But with XML, it might take something like 10–30 bytes. And loading it is means comparing strings and parsing decimal representations of integers and probably more.
Again, those performance and storage size differences may very well be too minuscule for you to even consider (and the work that it would take to devise custom format might be non-trivial), but in many cases, those differences do matter.
For example, I encountered a system that uses SMS messages for transmission of some data. That means you have 140 bytes (!) per message. And the device that sends and recieves those messages doesn't have GBs of memory and GHz of CPU. In that situation, you make sure that every bit counts and you certainly don't use XML.
我知道这是旧的,但我每天都处理固定宽度和 XML。你几乎可以总结为:
XML = 可读性
固定宽度 = 速度和低资源消耗
XML 主要是为了人类的可读性。我不在乎任何人对结构和验证的看法。如果您运行的系统确实不需要并且应该让人工读取您来回传递的文件,那么您实际上只是将其作为开销添加到处理文件所需的时间量和文件的大小,影响文件传输内容所需的时间以及对处理的另一个影响。所有这些也会影响使用 XML 文件的系统的内存使用情况。然而,XML 也有一些优点。您可以更松散地定义您的结构。有时,如果您的文件和代码都不需要字段长度为 255 个字符,则它会更容易。只是您的代码会加载该限制期。另一个优点是 XML 可以/应该带有定义 XML 内容要求的 XML Schema。这有助于拥有使用单个 API 的多个系统。如果您可以将您的模式提供给开发人员,他们可以非常快速地将类型化对象序列化为正确格式化和结构化的 XML。
固定宽度是为了速度和最小的资源消耗。设置起来可能比 XML 更繁琐。确保所有系统都知道“列”在固定宽度文件中的确切位置。通常并非所有系统都使用相同或所有列,因此您最终只能得到一个完全理解固定宽度内容的系统。这可能会使利用您传输的文件内容扩展 API 或系统变得具有挑战性。但是,由于没有字段标签、标签,只有原始数据,您通常可以通过网络发送一个较小的包。并非总是如此,在某些情况下,您可能有大量文本字段,这些字段中通常存储少量数据,但必须在输入段落长度的情况下保留较大的列宽。轮到你了'
不过一般来说,XML 是为了可读性。您通常不能只拿起一个固定宽度文件甚至 CSV 文件,然后立即开始掌握数据的含义。在哪里以及标记 XML 文件,您都可以。
有许多优点和缺点我没有谈到,但这是我看到真正的肉和土豆差异的地方。
在我意识到固定宽度的力量之前,我也有同样的问题。我们有一个表,其中包含数百万条记录,将它们提取到一个文件中,因为 JSON 将文件大小扩大到 15GB 和 2 小时以上。使用固定宽度时,它降低到 6.5GB 和 15 分钟。
提取和写入固定宽度比 JSON 更快。
我也尝试了 CSV,即使在这里,固定宽度的得分也更高。
可能主要是出于遗留原因,因为 XML、JSON(等)的解析器几乎存在于所有平台上。
正如您所建议的,理论上固定宽度的格式可以更节省空间;和阅读更简单。但这些似乎并不是什么显着的好处。
值得一提的是,像 CSV 这样的表格(但不是固定宽度)格式有其用途,结合了更紧凑的表示形式和可能更好的可读性;CSV 非常适合 map/reduce 样式的作业。
一个原因可能是处理 XML(不仅仅是读取和加载到内存结构中,而是考虑在 XML 文件中搜索正则表达式而不是简单的固定宽度或分隔文件,甚至对错误数据进行手动快速修复)更多比固定宽度的文件复杂。当然,现在有很多库可以为你做这件事,但如果没有一个适合你正在使用的平台的库,你真的想编写一个 XML 解析器,还是一个只在位置读取n个字节的程序x ?