gpt4 book ai didi

delphi - 从文本文件中查找字符串,从底部开始

转载 作者:行者123 更新时间:2023-12-05 06:52:30 24 4
gpt4 key购买 nike

我需要在文本文件中从底部(行尾)找到某个字符串。找到字符串后,函数退出。

这是我的代码,运行良好。但是,它有点慢。我的意思是,我每 5 秒运行一次这段代码。它消耗大约 0.5% 到 1% 的 CPU 时间。文本文件大约 10 MB。

如何加快速度?就像,速度非常快,而且不会占用太多 CPU 时间。

function TMainForm.GetVMem: string;
var
TS: TStrings;
sm: string;
i: integer;
begin
TS := TStringList.Create;
TS.LoadFromFile(LogFileName);
for i := TS.Count-1 downto 0 do
begin
Application.ProcessMessages;
sm := Trim(TS[i]);
if Pos('Virtual Memory Total =', sm) > 0 then
begin
Result := sm;
TS.Free;
exit;
end;
end;
Result := '';
TS.Free;
end;

最佳答案

您可以使用 TMemoryStream 并使用 LoadFromFile 来加载完整的文件内容。

您可以根据文件内容将属性 Memory 转换为 PChar 或 PAnsiChar 或其他字符类型。

有了指针后,就可以用它来检查内容了。我会避免使用字符串处理,因为它比指针操作慢得多。

您可以将指针从内存末尾移开(使用 Stream.Size)并向后搜索 CR/LF 对(或用作行定界符的任何内容)。然后从那时起检查搜索到的字符串。如果找到,你就完成了,如果没有,循环搜索之前的 CR/LF。

这比您使用的方法更复杂,但如果操作正确,速度会更快。

如果文件大到内存无法容纳,特别是在 x32 应用程序中,您将不得不求助于逐行读取文件,只保留一行,直到文件末尾。每次找到搜索到的字符串,然后保存他的位置。在文件末尾,这个保存的位置(如果有的话)将是最后搜索的文件。

如果文件确实很大,而且搜索到的字符串很有可能已经接近尾部,可以倒着读文件(设置TStream.position可以直接访问)。逐 block 。然后是每个 block ,使用前面的算法。请注意,根据 block 的大小,搜索到的字符串可能会被分成两 block 。

同样,根据文件大小,您可以使用多线程将搜索拆分为多个并行搜索。也不要创建太多线程。请注意,根据 block 的大小,搜索到的字符串可能会分成两个 block ,分配给不同的线程。

关于delphi - 从文本文件中查找字符串,从底部开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65955748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com