Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中,使用TStringList加载大型文本文件是最好的方法吗?_Delphi_Text Files - Fatal编程技术网

在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
优化是声明一个覆盖
TStrings.LoadFromStream
方法的子类-考虑到文件的结构,您可以尽可能快地创建它。

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


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

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

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

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

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


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

我怀疑每行文本的长度是否固定;OP说
它包含150个字段,每个字段至少50个字符。
。我认为固定数量是字段数。TStrings.LoadFromFile使用2*N内存,必须使用低级别加载程序对于大型文件,我需要从到文件进行比较。我有两个输入文件,一个作为主数据库,另一个是要比较的文件。我需要列出主数据库中与要比较的文件中的某些值匹配的所有字段。这解释了您正在做的事情,但仍然无法解释为什么必须以您希望的方式进行比较似乎已经决定。我仍然不清楚您是否不能使用流来完成您所描述的任务。如果性能是一个问题,那么我将首先使用TFileStream实现-如果性能确实成为一个问题,您可以立即转换为TMemoryStream。如果有必要,您可以查看更复杂的结构res基于具体性能问题的实际来源。