gpt4 book ai didi

objective-c - 如何在不使用大量内存的情况下在 Objective-C 中导入包含许多小记录的大文本文件

转载 作者:行者123 更新时间:2023-11-28 18:14:37 26 4
gpt4 key购买 nike

我需要能够将一些相当大的文本文件 (100Mb+) 导入到针对内存受限的移动设备的应用程序中的 CoreData。每个文件都包含大量的小记录,这些记录将在添加到数据库之前进行处理。通过许多来源,阅读文本文件的推荐方法似乎是:

NSString *stringFromFileAtPath = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

乍一看,这似乎是一种非常占用内存的方式来执行我需要的操作,但考虑到似乎没有其他推荐的读取文件的方式,我猜测 Apple 是否已考虑到这一点并执行他们自己的内存管理 - 也许只有在必要时才会从文件中获取数据?

如果不是,最好的方法是使用 NSStream 和 NSScanner 一次检索和处理一行文本吗?

如果推荐的方法确实能很好地处理内存,那么下一步通常是:

NSArray *lines = [stringFromFileAtPath componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

如果我使用这种方法,我假设它需要内存中的完整文本文件,所以它又会占用大量内存。为了节省内存,我最好还是使用 NSScanner,或者考虑到移动设备(当然是一些较旧的设备)的处理能力有限,它会永远完成吗?

在此先感谢您在这个问题上给我的任何帮助。

戴夫

最佳答案

内存映射文件是检查大文件内容的好方法。它看起来像 -[NSString initWithBytesNoCopy:length:encoding:freeWhenDone:] 会让你创建一个 NSString 直接使用内存映射文件的内容作为字符串的值。

我必须承认,我没有使用过那个特定的功能,但我的应用程序确实使用了内存映射文件,而且它们非常容易运行。因此,至少,您有一种不需要一次加载 100MB 数据的简单方法,但一次加载 100MB 数据的所有便利似乎都是一次加载。

使用 POSIX 函数 mmap 将文件映射到内存中。您将需要一个 POSIX 文件句柄,我的代码是从 open 获取的(在执行通常的歌舞以获取 bundle 中正确文件名的 UTF8 副本之后),但它可能是也使用 NS 工具之一完成。

关于objective-c - 如何在不使用大量内存的情况下在 Objective-C 中导入包含许多小记录的大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5451816/

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