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

时间:2011-02-27 15:48:59

标签: delphi text-files

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

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

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

提前谢谢。

4 个答案:

答案 0 :(得分:11)

TStringList永远不是处理大量文本的最佳方式,但它是最简单的。如果您手上有小文件,则可以使用TStringList而不会出现问题。即使您有大文件(不是大文件),您也可以使用TStringList实现您的算法版本以进行测试,因为它简单易懂。

如果您的文件很大,因为您可能将它们称为“数据库”,那么您需要研究一些替代技术,这些技术将使您能够从数据库中只读取所需数量。请看:

  • TFileStream的
  • 内存映射文件。

不要看Delphi中仍然可用的旧的“基于文件”的API,它们已经很老了。

我不会详细介绍如何使用这些方法访问文本,因为我们最近在SO上有两个类似的问题:

How Can I Efficiently Read The FIrst Few Lines of Many Files in Delphi

Fast Search to see if a String Exists in Large Files with Delphi

答案 1 :(得分:2)

由于您使用的是固定长度,因此您可以使用带有TWriter和TReader的TList构建一个访问类,该记录将记录您的记录。你不会有任何TStringList的开销(不是它是一件坏事,但如果你不需要它,为什么要这样)你可以建立你自己对类中记录的访问权限。 最终,它取决于您将数据加载到内存后要使用数据完成的任务。虽然TStringlist易于使用,但它不如“滚动自己的”效率高。

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

答案 2 :(得分:1)

如果您觉得问题很方便,我建议您遵守TStringList。优化是应该在以后完成的另一件事。

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

答案 3 :(得分:1)

从你的问题中不清楚为什么你需要将整个文件加载到内存中,然后继续创建内存中的数据集....你是否在混淆这两个问题? (也就是因为你需要创建一个内存中的数据集,你认为你首先需要将源数据完全加载到内存中?或者是否有一些源文件的初始预处理,只有整个文件加载到内存中才有可能(这是不太可能的,即使是这种情况,也不需要使用可导航的流对象,例如TFileStream)。

但我认为你正在寻找的答案就在那个问题上......

如果要加载此文件以便解析它并填充/初始化另一个数据结构(数据集)以进行进一步处理,那么使用现有的高级数据结构是不必要的并且可能代价高昂(就时间而言) )步骤。

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

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