处理非常大的SFTP上载-Cocoa

处理非常大的SFTP上载-Cocoa,cocoa,implementation,sftp,Cocoa,Implementation,Sftp,我正在开发一个小的免费Cocoa应用程序,它包含一些SFTP功能,特别是用于上传。该应用程序即将完成,但我遇到了一个相当糟糕的问题,关于上传文件夹,其中包含大量的文件 我正在使用来处理上传: CKTransferRecord * record; record = [connection recursivelyUpload:@"/Users/me/large-folder" to:@"/remote/directory"];

我正在开发一个小的免费Cocoa应用程序,它包含一些SFTP功能,特别是用于上传。该应用程序即将完成,但我遇到了一个相当糟糕的问题,关于上传文件夹,其中包含大量的文件

我正在使用来处理上传:

CKTransferRecord * record;
record = [connection recursivelyUpload:@"/Users/me/large-folder" 
                                    to:@"/remote/directory"];
这适用于大多数文件和文件夹。尽管在本例中@“/Users/me/large folder”包含300多个文件。调用此方法会使我的CPU旋转100%大约30秒,而我的应用程序没有响应(mac旋转球)。30秒后,我的上传排队,效果很好,但这并不理想。显然,枚举这些文件会导致我的应用程序锁定,直到完成为止

我真的不知道该怎么办。我对任何解决方案都持开放态度——即使使用不同的框架,尽管我已经做了研究,似乎是最好的解决方案


有什么想法吗?

使用Shark。开始采样,开始下载,挂起结束后立即停止采样

如果输出确认问题在ConnectionKit中,则有两种选择:

  • 换个别的
  • 贡献一个补丁,使其不挂起
  • 开源的美妙之处在于#2是可能的。这是我推荐的。然后,不仅您将拥有一个快速连接工具包,而且一旦维护人员接受了您的补丁,其他使用CK的人也可以拥有一个


    如果Shark发现问题不在ConnectionKit中(评测规则#2:你会感到惊讶),那么你就有Shark关于如何修复你的应用程序的指导。

    因为问题几乎肯定在枚举上,你可能需要将枚举移动到异步操作中。很可能他们正在为此使用
    NSFileManager-enumeratorpath:
    。如果这是主要问题,那么最好的解决方案可能是将工作转移到自己的线程上。考虑到涉及的时间很长,我怀疑他们实际上是在枚举期间读取文件的。解决这个问题的办法是在上传文件之前懒洋洋地读取文件

    彼得说鲨鱼是有帮助的,这是正确的,但在长期迷恋鲨鱼之后,我发现工具往往能更快地给出更有用的答案。您可以更轻松地使用仪器向CPU采样器添加磁盘I/O和内存分配磁道


    如果您仅以100%阻塞一个内核,我建议将活动线程设置为“主线程”,并将示例透视图设置为“所有示例计数”。如果您以100%阻塞所有内核,我建议将活动线程设置为“所有线程”,将示例透视图设置为“运行示例时间”

    将枚举移动到自己的线程上,阻止了程序锁定,但在运行期间,我仍然以100%的CPU运行。你能解释一下“懒散地”阅读文件是什么意思吗?它意味着尽可能晚地阅读文件。在这种情况下,它意味着在您准备上传文件之前不读取文件。我怀疑他们在枚举期间读取了所有文件,这可能不是一个好时机。如果有必要,NSFileHandle可以在后台读取例程,并在读取完成时通知您。