2009-08-09 87 views
0

我正在研究一个涉及一些SFTP功能的小型免费Cocoa应用程序,专门用于上传。该应用程序即将完成,但我已经遇到了上传包含大量文件的文件夹方面的一个相当不好的问题。处理非常大的SFTP上传 - Cocoa

我使用ConnectionKit处理上传:

CKTransferRecord * record; 
record = [connection recursivelyUpload:@"/Users/me/large-folder" 
            to:@"/remote/directory"]; 

这工作适合大多数文件和文件夹。尽管在这种情况下@“/ Users/me/large-folder”里面有300多个文件。调用这种方法使我的CPU高达100%达30秒左右,并且我的应用程序没有响应(mac旋转球)。在30秒后,我的上传排队并正常工作,但这并不理想。显然无论枚举这些文件是否导致我的应用程序锁定,直到完成。

不知道该怎么办。我接受任何解决方案 - 即使使用不同的框架,尽管我已经完成了我的研究,并且ConnectionKit似乎是最好的解决方案。

任何想法?

回答

1

使用鲨鱼。开始采样,开始下载,一旦挂起,停止采样。

如果输出确认问题是出在ConnectionKit,你有两个选择:

  1. 切换到别的东西。
  2. 贡献一个使其不挂起的补丁。

开源的美是#2是可能的。这是我的建议。那么,你不仅会拥有一个快速的ConnectionKit,而且一旦维护人员接受你的补丁,其他所有使用CK的人也可以拥有一个。

如果鲨鱼揭示的问题是在ConnectionKit不(规则#2分析的:你惊讶),那么你有鲨鱼就如何解决您的应用程序的指导。

1

由于问题几乎肯定存在于枚举上,因此您可能需要将枚举移动到异步操作中。很可能他们正在使用NSFileManager -enumeratorAtPath:。如果这是主要问题,那么最好的解决方案可能会将这项工作转移到自己的线程上。鉴于涉及的时间很长,我怀疑他们实际上是在枚举期间阅读文件。解决方案是在上传之前懒懒地阅读文件。

彼得是正确的,鲨鱼是有帮助的,但作为一个长期的鲨鱼粉丝,我发现仪器往往会提供更多更有用的答案更快。您可以使用仪器更轻松地将磁盘I/O和内存分配轨道添加到CPU采样器。

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

+0

将枚举移动到它自己的线程上,阻止了程序锁定,但是我仍然在100%的CPU期间运行。你能解释一下“懒惰地”阅读文件的意思吗? – nrj 2009-08-11 15:32:03

+0

这意味着尽可能晚地阅读文件。在这种情况下,它意味着在您准备上传文件之前不会读取文件。我怀疑他们在枚举期间正在读取所有文件,这可能不是一个好时机。如果有必要,NSFileHandle有例程在后台读取并在完成读取时通知您。 – 2009-08-11 23:43:06