【问题标题】:Using NSData efficiently高效使用 NSData
【发布时间】:2011-09-25 04:43:36
【问题描述】:

我有一些操作音频文件的代码,首先将所有音频文件数据放入 NSData 变量中。但它有时会崩溃,因为它使用了太多 RAM

 NSData *data1 = [NSData dataWithContentsOfFile: someFile];

我使用 Instruments 检查了所有内容都已发布以及 RAM 的使用方式,我发现它有时会在音频文件过大时崩溃。有没有办法以较小的位或闪存或任何其他方式存储数据,让我可以在不超过 iPhone 最大 RAM 的情况下处理大文件。

例如,我使用 NSData 的一件事是像这样连接 2 个文件:

 [data1 appendData: data2];

谢谢

【问题讨论】:

    标签: iphone objective-c file nsdata ram


    【解决方案1】:

    试试这个(来自这个SO问题):

    NSData* myBlob;
    NSUInteger length = [myBlob length];
    NSUInteger chunkSize = 100 * 1024;
    NSUInteger offset = 0;
    do {
        NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
        NSData* chunk = [NSData dataWithBytesNoCopy:(void*)[myBlob bytes] + offset
                                             length:thisChunkSize
                                       freeWhenDone:NO];
        offset += thisChunkSize;
        // do something with chunk
    } while (offset < length);
    

    然后,您可以将每个较小的块存储在某个地方,并在连接后稍后使用它做您想做的事情。

    这一切都没有经过我的测试,但似乎是合理的。

    【讨论】:

      【解决方案2】:

      有没有办法以较小的位或闪存或任何其他方式存储数据,让我可以在不超过 iPhone 上最大 RAM 的情况下处理大文件。

      当然。这个问题比NSData 更根本——你通常不会将一组音频文件(全部)加载到内存中,尤其是当设备的内存非常少时。即使在 osx 上加载整个文件也是不典型的,在那里您可以拥有大量内存(除非已知文件非常小)。这就是为什么音频文件 API 允许您以块为单位进行读写(参考:ExtAudioFileReadAudioFileReadPackets)。

      【讨论】:

      • 谢谢,没想到api。我还没有尝试过,但从我看来它应该可以工作。
      • 来自多年来编写了很多音频节目的人:别担心,它确实有效(不仅仅是应该)。不客气
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2018-06-04
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多