gpt4 book ai didi

cocoa - 文件列表的最佳 cocoa 数据结构

转载 作者:行者123 更新时间:2023-12-03 17:29:23 26 4
gpt4 key购买 nike

我正在编写一个程序,运行时可以处理数百个文件。现在,每个文件和文件夹都存储在我创建的一个对象中(它包含文件路径、文件类型、文件大小、指向文件中偏移量的指针以及是否是目录),并且这些对象被放置在 NSMutableArray 中。一个大问题是在处理所有文件结束时,我需要获取每个文件夹中所有文件的统计信息。我使用 2 个嵌套的 for 循环来执行此操作,但性能很糟糕。

我的问题是这样的:是否有一种更有效的方法来存储 cocoa 中的文件和文件夹列表(除了 NSMutableArray、集合等),以便我可以快速访问所有文件夹以及这些文件夹内的所有对象?是否有某种结构可以创建文件夹数组以及位于该父文件夹中的文件和文件夹数组?

最佳答案

Right now each file and folder is stored in an object I created (it contains the filepath, filetype, filesize, a pointer to an offset in the file, and if it is a directory), and those objects are placed in a NSMutableArray.

这是正确的解决方案。 C 数组比较棘手,因为您必须自己处理大小管理,并且无法进行边界检查。

A big problem with this is at the end of processing all the files, I need to get statistics for all the files in each folder. I am doing this using 2 nested for loops, and the performance is terrible.

您是否使用 Shark 和/或 Instruments 进行过分析?这是您应该检查的第一件事(如果您还没有检查的话)。瓶颈可能并不在你想象的地方。在您进行分析之前,请停止阅读此答案(以及任何其他答案)。

<小时/>

如果您当前正在阻塞主线程执行此任务,请考虑改用 NSOperationQueue。对于顶层中的每个项目,如果它是一个文件,则添加一个检查该文件的操作,如果它是一个目录,则添加一个对目录内容执行相同迭代的操作。如果您需要 Snow Leopard,您会在这里找到方便的 block ,因为您不必显式告诉目录 list 操作将检查文件操作添加到哪个队列。

您可能应该限制队列一次运行的操作数量,以免最终运行太多操作。 Mike Ash has details (那篇文章是关于 GCD 的,但是从 Snow Leopard 开始,NSOperationQueue 是基于 GCD 的)。

假设您在 UI 中显示运行总计,则可以使用主队列来保存向总计添加新信息的操作(可能基于 block )。如果您支持 Leopard,您可以创建自己的“主”队列,但您必须自己让操作在主线程上运行。

顺便说一句,如果您要总计文件大小,您应该考虑是否要在 inode 上进行统一。如果我将一个 200 MiB 文件硬链接(hard link)到其他三个位置,您将看到四个文件,但它们实际上都是同一个文件,因此它们只占用 200 MiB,而不是 800。

关于cocoa - 文件列表的最佳 cocoa 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740948/

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