在Delphi中,使用TStringList加载大型文本文件是最好的方法吗?

在Delphi中,使用TStringList加载大型文本文件是最好的方法吗?,delphi,text-files,Delphi,Text Files,在delphi中加载大型文本文件数据的最佳方法是什么?是否有任何组件可以加载文本文件superfast 假设我有一个包含数据库的文本文件,并以固定长度格式存储。 它包含150个字段,每个字段至少包含50个字符。 1.我需要把它载入内存 2.我需要解析它,并可能将其存储在memdataset中进行处理 我的问题是: 1.如果我使用TStringList.loadFromFile方法就足够了吗? 2.是否有其他更好的组件来操作文本文件? 3.我应该使用文本文件的低级别读取吗 提前谢谢。t使用Trin

在delphi中加载大型文本文件数据的最佳方法是什么?是否有任何组件可以加载文本文件superfast

假设我有一个包含数据库的文本文件,并以固定长度格式存储。 它包含150个字段,每个字段至少包含50个字符。 1.我需要把它载入内存 2.我需要解析它,并可能将其存储在memdataset中进行处理

我的问题是: 1.如果我使用TStringList.loadFromFile方法就足够了吗? 2.是否有其他更好的组件来操作文本文件? 3.我应该使用文本文件的低级别读取吗


提前谢谢。

t使用Tringlist从来都不是处理大量文本的最佳方式,但它是最简单的。如果你手头有小文件,你可以毫无问题地使用TStringList。即使您有大文件(不是大文件),您也可以使用TStringList实现一个用于测试的算法版本,因为它简单易懂

如果您的文件很大,因为您称它们为“数据库”,所以它们可能很大,那么您需要研究其他技术,使您能够从数据库中只读取所需的数据。研究:

  • TFileStream
  • 内存映射文件
不要看旧的基于“文件”的API在Delphi中仍然可用,它们已经很旧了

我不打算详细介绍如何使用这些方法访问文本,因为我们最近遇到了两个类似的问题:


TStringList从来都不是处理大量文本的最佳方式,但它是最简单的。如果你手头有小文件,你可以毫无问题地使用TStringList。即使您有大文件(不是大文件),您也可以使用TStringList实现一个用于测试的算法版本,因为它简单易懂

如果您的文件很大,因为您称它们为“数据库”,所以它们可能很大,那么您需要研究其他技术,使您能够从数据库中只读取所需的数据。研究:

  • TFileStream
  • 内存映射文件
不要看旧的基于“文件”的API在Delphi中仍然可用,它们已经很旧了

我不打算详细介绍如何使用这些方法访问文本,因为我们最近遇到了两个类似的问题:


如果您觉得方便解决问题,我建议您坚持使用
TStringList
。优化是以后应该做的另一件事


至于
TStringList
优化是声明一个覆盖
TStrings.LoadFromStream
方法的子类-考虑到文件的结构,您可以尽可能快地创建它。

如果您觉得方便解决问题,我建议您坚持使用
TStringList
。优化是以后应该做的另一件事


至于
TStringList
优化是声明一个覆盖
TStrings.LoadFromStream
方法的子类-考虑到文件的结构,您可以尽可能快地创建它。

因为您使用的是固定长度,您可以使用TWriter和TReader基于TList构建一个访问类,该类将考虑您的记录。您将没有TStringList的开销(并不是说它是一件坏事,但如果您不需要它,为什么要有它),并且您可以将自己对记录的访问构建到类中。 最终,这取决于一旦将数据加载到内存中,您试图用它完成什么。虽然TStringlist很容易使用,但它不如“自己滚动”那么有效


但是,数据操作的效率可能不是什么大问题,因为您使用文本文件来保存数据库。如果您只需要读入文件并根据文件中的数据做出决定,那么更灵活的TList可能会有点过头。

由于您使用的是固定长度,因此您可以基于TList构建一个access类,该类带有一个TWriter和TReader,可以考虑您的记录。您将没有TStringList的开销(并不是说它是一件坏事,但如果您不需要它,为什么要有它),并且您可以将自己对记录的访问构建到类中。 最终,这取决于一旦将数据加载到内存中,您试图用它完成什么。虽然TStringlist很容易使用,但它不如“自己滚动”那么有效


但是,数据操作的效率可能不是什么大问题,因为您使用文本文件来保存数据库。如果您只需要读入文件并根据文件中的数据做出决定,那么更灵活的TList可能会有些过头。

您的问题并不完全清楚,在创建内存中的数据集之前,为什么需要将整个文件加载到内存中。。。。你把这两个问题混为一谈了吗?(即,由于您需要创建内存中的数据集,您认为首先需要将源数据完全加载到内存中?或者是否对源文件进行了一些初始预处理,而只有在将整个文件加载到内存中时才可能进行这些预处理(这是不可能的,即使是这种情况,对于可导航流对象(如TFileStream)也没有必要这样做)

但我认为你要寻找的答案就在问题的正前方

如果加载此文件是为了对其进行解析并填充/初始化进一步的数据结构(数据集)以进行进一步处理,则使用现有的高级数据结构是一个不必要且可能成本高昂的步骤(就时间而言)

使用提供所需功能的最低级别访问方式


在这种情况下,TFileStream可能会提供方便性和易用性的最佳平衡。

您的问题并不完全清楚为什么要这样做