将大量数据从 iPad 转换/上传到 Dropbox

2024-01-01

我正在通过 Instruments 运行我的应用程序并使用大量数据对其进行压力来完成它。仪器测试进展顺利,但压力测试是我遇到问题的地方。在不涉及太多细节的情况下,我为我的应用程序提供了越来越多的Core Data它需要推断数据、制作图表并在地图上显示位置的事件MKMapView实例。我从小规模开始,增加到 56000 个事件,它处理得很好,没有任何泄漏或内存警告(我为它处理这一切感到非常自豪)。

我的应用程序实现了 Dropbox API,以允许上传和下载模板和数据以实现同步目的。从我的应用程序上传的文件是从Core Data to an NSDictionary,然后到NSData。我为数据创建一个临时文件夹,然后将该文件上传到 Dropbox,一切正常......正常。如果我尝试上传包含 56000 个事件的数据文件,则会崩溃。我已经记录了它并观察了数据的转换。它毫无问题地到达了最后一个事件,但是当它应该开始上传到 Dropbox 时,应用程序崩溃了,我一辈子都无法弄清楚原因。我看到日志上弹出内存警告。通常,它会进入 Level=1、Level=2、Level=1、Level=2,然后崩溃,这让我很困惑,因为它永远不会达到 Level=3。

我找到的大部分信息都在我在底部的编辑中。下面是一些相关代码:

- (void)uploadSurveys:(NSDictionary *)dict {
    NSArray *templateArray = [dict objectForKey:@"templates"];
    NSArray *dataArray = [dict objectForKey:@"data"];
    NSString *filename;
    NSLog(@"upload called");
    if ([templateArray count] || [dataArray count]) {
        if ([templateArray count]) {
            // irrelevent code;
        }
        if ([dataArray count]) {
            SurveyData *survey;
            for (int i = 0; i < [dataArray count]; i++) {
                BOOL matchExists = NO;
                // ...... code to make sure no file exists in dropbox folder and creates new version if necessary;

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                NSData *data = [self convertSurvey:survey];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self uploadData:data withFilename:filename];
                    NSLog(@"converted and uploading");
                });
            });
        }
    }
}

[self convertSurvey:survey]只是转换我的Core Data反对NSData.

- (void)uploadData:(NSData *)data withFilename:(NSString *)filename {
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *pathComponent = [NSString stringWithFormat:@"tempData.%@", filename];
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:pathComponent];
    if ([manager createFileAtPath:path contents:data attributes:nil]) {
        [self.restClient uploadFile:filename toPath:[NSString stringWithFormat:@"/%@", currentSearch] fromPath:path];
        NSLog(@"uploading data");
    }
}

任何帮助将不胜感激,我提前衷心感谢您。我只是想弄清楚我是否对大文件采取了错误的方法或者是否根本不允许。如果我必须拆分文件,那很好,但在我尝试解决方法之前,我更想知道发生了什么阻止我的应用程序执行此操作。再次感谢你。

更新:由于这个问题现在是发布我的应用程序的唯一障碍,因此我为此问题添加了赏金,以希望获得解决方案或解决方法。它将持续一周,之后给定时间我很可能会在上传文件时将其拆分,以确保不会达到明显的大小限制。这种方法并不理想,这就是为什么更好的解决方案非常受欢迎,但如果这不能带来更方便的东西,这是我的后备计划。

编辑:看来NSTemporaryDirectory根本不参与其中。这是新的情况。正如您在上面的代码中看到的,NSData *data = [self convertSurvey:survey];在辅助线程中调用(这不是问题)。我一直在记录创建的对象,并且知道它们已经到达最后一个,但从未想过检查并查看是否NSData文件已返回。事实证明,事实并非如此。简而言之,我将所有核心数据对象转换为数组并将它们放入字典中(仅用于要转换的相关调查/数据)。这确实有效并且字典已创建。然后我创建一个NSData文件使用NSData *data = [NSKeyedArchiver archivedDataWithRootObject:d]; where d是我的字典。之后我立即打电话return data;设置值NSData *data = [self convertSurvey:survey];。既然如此,看来NSData or NSKeyedArchiver都是这里的错。根据苹果文档:

使用32位Cocoa,数据的大小理论上受到2GB的限制(实际上,因为内存会被其他对象使用,这个限制会更小);使用 64 位 Cocoa,数据大小受到约 8EB 的理论限制(实际上,该限制不应成为一个因素)。

我以较小的增量检查了文件大小,以查看故障发生的位置。我已经成功获取了 48.2MB 的数据,但不是 51.5MB,这让我相信问题发生在 50MB 左右,远低于理论限制NSData(除非 iOS 和 OS X 在这方面存在差异)。

希望这个新信息将有助于解决这个问题


NSData 的 2 GB 限制在 iOS 上完全是理论上的,即使 iPhone 4 只有 512 MB RAM 并且 iOS(与 Mac OS X 不同)无法交换,因此如果您的物理 RAM 已满,您会崩溃(或者您的应用程序会在之前终止)那)。

50MBNSData单独的对象已经非常大,并且它不是内存中唯一的对象 - 假设您将数据从 Core Data 转换为字典表示,然后再转换为NSData,您可能消耗至少两倍的内存(可能更多)。系统和其他应用程序也需要 RAM,因此您可能已达到限制。

尝试在 Instruments 中运行您的应用程序,看看您实际消耗了多少内存。

为了减少峰值内存使用量,您有几个主要取决于您的数据模型的选项:

  • As 贾森·福尔曼 https://stackoverflow.com/questions/6794194/converting-uploading-large-amounts-of-data-from-ipad-to-dropbox/7029979#7029979他的回答中建议,尽量避免将整个文件一次性保存在内存中。使用NSFileHandle http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSFileHandle_Class/Reference/Reference.html,您可以将数据块写入文件,而无需立即将整个数据存储在内存中。当然,这需要您相应地准备数据,以便可以将其分割成块。更高级别的方法可能是将数据序列化为 XML 格式,您可以将其作为流写出。如果您的数据格式非常简单,那么 CSV 之类的格式也可能有效。

  • 不要使用NSData用于上传到 Dropbox。将数据写入文件(参见上文)并将 Dropbox SDK 指向该文件。 Dropbox SDK 使这一切变得非常容易(DBRestClient has an uploadFile:toPath:fromPath:方法)。

  • 如果您的数据模型难以采用流式处理方法,请尝试将数据分割成更易于管理的部分。然后,您可以使用旧的序列化字典的方法,仅使用多个文件。

  • 请注意 Core Data 的内存使用情况。尝试使用重新故障对象refreshObject:mergeChanges:如果可能的话,打破数据中的循环引用(请参阅核心数据编程指南 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html#//apple_ref/doc/uid/TP40001860-SW3了解详情)。

  • 避免在长时间运行的循环中使用自动释放池,或者创建一个单独的自动释放池NSAutoreleasePool在循环的每次迭代中都会耗尽。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将大量数据从 iPad 转换/上传到 Dropbox 的相关文章

  • 从 robovm 项目创建 iOS 静态库(JNI 中的 BAD_ACCESS)

    我有大量的Java代码 只有计算函数 没有UI 我想在iOS中将其重用为静态库 我的方法是使用robovm http www robovm com并按照robovm论坛中两篇文章中描述的非官方方式创建静态库 1 基本方式 https gro
  • 将 UIToolBar 添加到所有键盘(swift)

    我正在尝试以尽可能少的重复次数将自定义 UIToolBar 添加到我的所有键盘中 我目前的做法要求我将代码添加到所有 viewDidLoads 中 并将每个文本字段的委托分配给我正在使用的 viewController 我尝试创建自己的 U
  • 如何动态获取 UITableViewCell 的高度

    我创建了自定义的tableViewCell 我在UITableViewCell中添加了UIView SubView 所以我在 UIView 中的所有动态文本和图像内容都会根据文本和图像大小而变化 但现在 HeightforRowAtInde
  • 如何使用 CNContacts 快速获取手机号码?

    我有一些代码可以检索用户联系人中的所有电话号码 但只想过滤掉手机号码 目前 我只是通过将第一个数字为 或第二个数字为 7 的数字添加到数组中来实现此目的 如下所示 func findContacts gt CNContact let key
  • Flutter 应用程序在 iOS 平台的 firebase 电话身份验证中崩溃

    我在我的项目中实现了 Firebase Phone auth 在 Android 端 一切正常 但对于 iOS 端 当我尝试从我的端发送验证码时 应用程序崩溃并失去连接 我已在下面提交了我的代码 主程序 dart class MyApp e
  • 有什么方法可以询问方法的名称吗?

    我正在尝试调试我正在开发的 iPhone 应用程序 向各种源文件添加 50 条 NSLog 语句的想法让我感到很兴奋 我想做的是写一对陈述 比如 NSString methodName self methodName NSLog metho
  • ABAddressBookCopyArrayOfAllPeople 中缺少联系人

    我试图从我的应用程序中的地址簿中查找电话号码 但很惊讶没有找到它 问题是 我已经在我的应用程序访问的控制台中打印了地址簿的所有号码 奇怪的是 有些联系人丢失了 我正在将输出与我的地址簿进行比较 虽然数量很少 但仍然如此 这就是我访问地址簿的
  • Objective-C 中是否有相当于 C++ 动态转换的功能?

    如果我有两个类 子类和超类 SuperClass super new SuperClass SubClass sub new SubClass SubClass sub pointer The nice one line cast belo
  • 如何按字母顺序对 UITableView 分区进行排序?

    我有一个包含 3 个类别的分段 UITableView 我正在使用这段代码 NSArray arrayOne NSArray arrayWithObjects one two three four nil NSDictionary dict
  • iOS 7 tabBar 横线,如何去掉?

    Apple 在 iOS 7 中的 tabBar 上添加了一条细线 该线应该在 tabBar 和 UI 之间起到阴影或淡入淡出的作用 由于我使用的是定制的 tabBar 这条线非常令人恼火 你如何删除它 请告诉我这是可能的 否则我需要重新设计
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 当应用程序进入前台时,如何重新启动基于块的动画?

    我有以下基于块的动画 UIView animateWithDuration 0 5f delay 0 0f options UIViewAnimationOptionRepeat UIViewAnimationOptionAutorever
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • iOS7 由 Interface Builder 生成的 NSIBPrototypingLayoutConstraint 自动布局约束问题

    以前在 iOS6 中 我的聊天消息视图控制器使用 IB 中精心构建的自动布局约束正确显示和动画 下面是 Xcode 5 中删除了约束的当前视图层次结构 升级到 XCode 5 和 iOS7 后 我发现我需要清除所有旧的约束才能解决默认的半透
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 诊断和仪器均缺少“僵尸”选项

    运行 Xcode 4 0 2 Zombie 选项丢失 其他 SO 帖子建议找到它的两个地方 Product gt Run looks like this Product gt Profile looks like this 奇怪的是 我之前
  • UIViewController 内的 UIsearchController 使用自动布局

    有没有人成功实施过UIViewController其中包含两个UISearchController searchBar and a UItableView使用自动布局来布局所有内容 我正在尝试实现类似的目标1密码 https itunes
  • Unwind segue 的用途是什么以及如何使用它们?

    iOS 6 和 Xcode 4 5 有一个称为 Unwind Segue 的新功能 展开转场可以允许过渡到故事板中场景的现有实例 除了 Xcode 4 5 发行说明中的 这个简短条目之外 UIViewController 现在似乎还有几个新
  • Fitbit oauth2 公共 API 停止工作。给出错误 - 抱歉,这不是你..是我们

    几个月前 我准备了一个关于 Fitbit oauth2 公共 API 的演示 其中我使用特定用户登录并获取他的活动 一切正常 但最近 我打开演示并尝试使用同一用户登录 但它没有登录并反复出现此错误 我尝试更改在 Fitbit 上注册的演示应

随机推荐

  • Python 3.7,tkinter,jpg:无法识别图像文件中的数据

    我想寻求一些有关 python3 中的 tkinter 的帮助 我似乎无法使用以下代码在标签中显示 jpeg 图像文件 def changephoto self self tmpimgpath filedialog askopenfilen
  • 指令:$observe,类属性更改仅捕获一次

    我有一个更改 div 样式的指令 并且希望每次元素的类更改时 observe 都会通知我 问题是它发生在指令创建时而不是之后 这是代码和fiddle http jsfiddle net unludo 2h97m 21 div div spa
  • 在 django 中禁用视图或 url 的缓存

    在 django 中 我编写了一个仅返回文件的视图 现在我遇到了问题 因为 memcache 正在尝试缓存该视图 用它的话来说 TypeError 无法pickle 文件对象 由于我实际上确实需要使用此视图返回文件 我基本上为此视图创建了一
  • 使用 Spark 以编程方式创建嵌套数据框

    我正在尝试从嵌套 RDD 创建数据框 当然我可以使用toDF 方法 但我的RDD是一个案例类 在scala 2 10中有超过100个字段 如下所示 case class User val user id String valuser nam
  • 从 recordset.field.type 属性获取 ADO 数据类型的名称?

    我需要从 Access 表中生成字段列表 名称 类型和大小 这个简单的 VB 代码给了我almost我需要的 Set rs CurrentDb OpenRecordset myTable For x 0 To rs Fields Count
  • 如何在不改变窗口焦点的情况下打破全部

    在测试 Windows 窗体 UI 时 我经常希望在代码运行时修改代码 单击 Break All 箭头可以为我完成此操作 但是 Visual Studio 始终显示 Program cs 窗口并将焦点设置在 Application Run
  • 是否可以通过 .NET 代码对二进制文件进行签名? (没有signtool.exe)

    我有以下要求 使用证书签署二进制文件 但没有signtool exe 这个想法是通过代码来完成 你知道这是否可能吗 您将需要使用签名者签名 http msdn microsoft com en us library windows desk
  • 为什么 jquery ui 按钮在 Firefox 和 Chrome 中看起来不同

    我已经上传了一个示例页面https bobdn com Temp aspx https bobdn com Temp aspx 该页面只有一个 jquery UI 按钮 为什么这在 Firefox 中看起来有点大 填充和字体大小看起来都很大
  • SVG defs 上的鼠标事件(遮罩)

    背景图像上有 svg SVG 是一个中间有圆孔的正方形 作为示例 背景图像穿过圆圈出现 我想用鼠标拖动这个圆圈 但如何从 javascript 访问 svg 内的 defs 尚不清楚 我可以更改属性 但 onclick 事件对它们不起作用
  • jQuery + Ajax 哈希/历史记录等

    我正在尝试使用 jQuery 中的 URL 哈希来控制 Ajax 中的历史记录并使链接 页面可添加书签 我已经尝试了几乎所有插件 但似乎都无法正常工作 所以我实际上没有任何代码示例 但我愿意接受任何建议 信息 教程等 我试图将其合并到的其中
  • 类型提供程序可以作为参数传递给函数吗

    我正在学习 F 和FSharp 数据库 http fsharp github io FSharp Data 我有一个任务需要读取 20 个 CSV 文件 每个文件都有不同数量的列 但记录具有相同的性质 以日期字符串为键 所有其余列都是浮点数
  • 使用 EPPlus 复制/克隆 Excel 形状?

    是否可以使用 EPPlus 库在 Excel 工作表中创建形状的副本 克隆 我知道我可以得到一个现有的对象 var shapeExisting ws Drawings ShapeName ws是工作表对象 并创建新形状 var shapeN
  • CKEditor只读

    自从我使用 CKEditor 以来我遇到了一个问题 http ckeditor com http ckeditor com 问题是我找不到使编辑器只读的方法 而且我不能只使用文本区域 因为我想保持一致性 我已经在 StackOwerflow
  • 制作 Flash 游戏的可下载版本的最佳方法是什么?

    我已经用 Flash 制作了一款游戏 我想为那些宁愿离线玩的人提供一个简单的下载 事实是 我使用文件夹整体结构来动态加载每个级别的内容 文件夹结构看起来像这样 但这并不重要 游戏文件夹 animations 动画1 swf 动画2 swf
  • 使用 Apache POI 从 java 中的 excel 工作表读取数据

    我需要在 java 中读取 Excel 工作表中的数据 我能够读取普通字符串 但是当我尝试读取包含日期和时间的单元格 28 5 2018 10 00 时 我只得到日期为 2018 年 5 月 28 日 这是Excel单元格 此代码读取日期
  • NReco PDFGenerator 问题

    我已经使用这个工具大约一周了 现在 今天 它停止工作了 我已将其余代码恢复到之前的状态 但仍然出现相同的错误 我从抛出的异常中得到的所有信息是 NReco PdfGenerator dll 中发生 System Exception 类型的异
  • 在 Draft.js 中获取插入符位置(行号)

    如何获得 Draft js 中的插入符号位置 我想你可以从选择状态中获取块 然后获取块数组并查看块数组位于哪个位置 但我不确定这是一种可靠的方法 甚至是最好的方法 不确定这是否是您的意思 但您可以像这样获取当前块的索引 const curr
  • 为什么从命令提示符运行 JAR 文件时出现异常?

    您好 我使用 eclipse 上的导出选项制作了一个可运行的 JAR 文件 但是 当我通过命令提示符运行文件时 我得到以下信息 Exception in thread main java lang NoSuchMethodError at
  • Golang 歧义错误重新定义

    为什么可以redefine the err多变的 err ipdf Open source if err nil panic Couldn t open pdf payload err ioutil ReadFile other if er
  • 将大量数据从 iPad 转换/上传到 Dropbox

    我正在通过 Instruments 运行我的应用程序并使用大量数据对其进行压力来完成它 仪器测试进展顺利 但压力测试是我遇到问题的地方 在不涉及太多细节的情况下 我为我的应用程序提供了越来越多的Core Data它需要推断数据 制作图表并在