我在一款应用中使用TClientDataSet管理从多个CSV文件导入的大量数据,总共可能有100万条或更多。我想能够删除与特定CSV文件关联的所有数据集条目,但是删除大量条目的时间非常缓慢。
作为一个测试来尝试确定是否做了愚蠢的事情,我创建了一个简单的控制台应用程序。它所做的一切就是:
- 创建带有1个字段定义(ID)的TClientDataSet实例 - 添加100,000个记录 (需要0.1秒) - 删除50000个记录(需要约4秒,如果`LogChanges=TRUE`则需要约4.4秒)
如果我有150万个数据集项,并且想要删除50万个条目,则通过此方法删除条目需要的时间如此之长,以至于我甚至无法测量它。为解决这个问题,我现在正在使用一个变通方法:创建一个新数据集,然后将要保留的所有条目复制到新副本中并删除原始副本。除非我只从原始数据集中删除了少部分条目,否则这种方法都要快得多。
也许我没有使用最合适的方法来删除数据集项?我猜测每次删除项目时会触发一堆内部处理。是否有一种一次性删除一系列项目的方法我没注意到?也许我可以设置一个索引和一个基于该索引的范围,然后删除当前范围内的所有项目?
也许问题在于ClientDataSet而不是我?也许我需要使用其他组件。有什么建议吗?
作为一个测试来尝试确定是否做了愚蠢的事情,我创建了一个简单的控制台应用程序。它所做的一切就是:
- 创建带有1个字段定义(ID)的TClientDataSet实例 - 添加100,000个记录 (需要0.1秒) - 删除50000个记录(需要约4秒,如果`LogChanges=TRUE`则需要约4.4秒)
如果我有150万个数据集项,并且想要删除50万个条目,则通过此方法删除条目需要的时间如此之长,以至于我甚至无法测量它。为解决这个问题,我现在正在使用一个变通方法:创建一个新数据集,然后将要保留的所有条目复制到新副本中并删除原始副本。除非我只从原始数据集中删除了少部分条目,否则这种方法都要快得多。
也许我没有使用最合适的方法来删除数据集项?我猜测每次删除项目时会触发一堆内部处理。是否有一种一次性删除一系列项目的方法我没注意到?也许我可以设置一个索引和一个基于该索引的范围,然后删除当前范围内的所有项目?
也许问题在于ClientDataSet而不是我?也许我需要使用其他组件。有什么建议吗?
LogChanges
。 - Ondrej Kelle