4

我的应用程序必须读取存储在文件中的数据并获取变量或数组的值才能对其进行处理。

我的问题是,哪种文件格式可以快速轻松地从文件中检索数据。

我正在考虑使用 .xml、.ini 或只是一个简单的 .txt 文件。但是要读取 .txt 文件,我将不得不编写大量带有许多 if 或 else 条件的代码。

我不知道如何使用 .ini 和 .xml。但是,如果它们会更好更快,那么我会先学习它们,然后再使用它们。请指导我。

4

5 回答 5

5

我将假设您在这里表示的是原始性能不是系统健壮性的优先级。

对于值与名称配对的简单数据,ini 可能是最简单的解决方案。更复杂的结构化数据将引导您使用 XML。根据之前提出的问题,如果您使用 C#(因此假定使用 .Net)XML 通常是首选,因为它已内置到 .Net 库中。由于 xml 更灵活并且可以根据程序的需要进行更改,因此我个人也会推荐 xml 而不是 ini 作为文件标准。学习 XML 库需要做更多的工作,但是它很快就会得到回报,并且是一个标准化的系统。

文本可能很快,但您可能会为了速度而牺牲大量强大的解析行为,或者花费更多的工时开发和维护高速专用解析器。

有关读取 xml 文件的参考:(在 .Net 库中本机支持)

有关读取 ini 文件的参考资料:(.Net 库本身不支持)

于 2013-02-06T20:50:30.413 回答
4

如果它是表格数据,那么仅使用 CSV(逗号分隔值)文件可能会更快。

如果它是结构化数据(如树或其他东西),那么您可以使用 C# 中的 XML 解析器,它更快(但您需要付出一些学习努力)

如果数据像字典一样,那么 INI 将是更好的选择。这实际上取决于您的应用程序中的数据类型

或者,如果您不介意 RDBMS,那么这将是一个更好的选择。通常,一个好的 RDBMS 被优化为处理大数据并非常快速地读取它们。

于 2013-02-06T20:20:42.757 回答
1

如果您不介意二进制文件(人们无法读取和修改自己的文件),最快的方法是将一组数字序列化到文件中,然后从文件中反序列化。

该文件会更小,因为数据存储效率更高,需要更少的 I/O 操作来读取它。它还需要最少的解析(实际上是最少的),因此阅读速度会很快。

假设您的号码位于此处:

int[] numbers = ..... ;

您可以使用以下代码将它们保存到文件中:

using(var file = new FileStream(filename, FileMode.Create))
{
    var formatter = new BinaryFormatter();
    formatter.Serialize(numbers, file);
}

要从文件中读取数据,请打开它,然后使用:

numbers = (int[])formatter.Deserialize(file);
于 2013-02-06T20:37:48.650 回答
1

我认为@Ian T. Small 很好地解决了文件类型之间的差异。

鉴于@Shaharyar 对@Aniket 的回应,鉴于我们拥有的范围信息有限,我只想将其添加到 DBMS 对话中作为解决方案。

数据集会增长吗?条目如何构成“许多字段”?

我同意 r-dbms(关系)是一个潜在的解决方案,远远超过大型数据集。下一个问题是什么是大数据集。

什么时候(以及哪个)DBMS 是个好主意
当@Shaharyar 说很多字段时,我说的是 10 个或 100 个字段?
=> 10-20 个字段不需要 r-DBMS 的开销(安装大小、CRUD 代码等)。对象的 XML 序列化要简单得多。

=> 如果存在不确定数量的字段(即:字段数量随着时间的推移而增加),他需要符合ACID,或者有数百个字段,那么我会说@Aniket 就位。

@Matt 对 NoSQL 的建议也很棒。它将提供高吞吐量(远远超过每隔几秒更新一次所需的)和简化的序列化/反序列化。

我在这里看到的唯一缺点是应用程序大小/配置。(即使是重量轻、易于配置的 MongoDB 也会为 DBMS 设施和驱动程序增加 10 MB。对于旨在快速轻松分发的小于 1MB 的小型应用程序来说并不理想。)哦,@Shaharyar,如果您确实需要 ACID 合规性,请确保首先检查数据库。例如,Mongo 不提供它。并不是说您将永远丢失数据,只是无法保证。

另一个选项 - 没有 DBMS,但增加了吞吐量
我想提出的最后一个建议将需要一些代码(特别是一个充当缓冲区的对象)。
如果
1. 数据集很小(10 不是 100)
2. 字段数量是固定的
3. 没有 ACID 合规性要求
4. 你担心事务负载增加(即:每秒更新很多)

你也可以只缓存数据存储对象中的更改并在程序关闭时刷新,或者每隔“n”秒/分钟/等刷新一次。

根据@Ian T. Small 的帖子,我们将使用内置于 .Net 框架中的原生 XML 类序列化。

以下只是过于简化的伪代码,但应该给您一个想法:

public class FieldContainer
{
    bool ChangeMade
    Timer timer = new Timer(5minutes)


    private OnTimerTick(...)
    {
          If (ChangeMade)
             UpdateXMLFlatFile()
    }
}
于 2013-02-06T21:42:56.837 回答
0

它需要多快?

txt 将是最快的选择。但是您必须自己编写解析器。(速度确实是有代价的)

xml 可能是最容易实现的,因为您需要 xmlSerializer(或其他类)来进行艰苦的工作。

对于小型配置文件(约 0.5MB 或更小),您将无法分辨速度上的任何差异。当涉及到非常大的文件时,txt 和自定义文件格式可能是要走的路。然而,你总是可以选择任何一种方式:看看像 OpenStreetMap 这样的项目,它们有巨大的 xml 文件(> 10 GB)并且它仍然可用。

于 2013-02-06T20:23:20.443 回答