在PDF中搜索会增加应用程序的内存使用量太多

4

我注意到当搜索大型PDF文件时,应用程序的内存使用量会增加,因为PDFKit正在进行某些内部搜索缓存。有没有办法控制这个缓存大小?在我的情况下,当搜索完成时,缓存的内存增加了500MB以上。

为了在PDF文档中搜索,我使用了以下方法:

func beginFindString(_ string: String, withOptions options: NSString.CompareOptions = [])


你必须在手机上完成这个任务而不是在服务器端完成,有什么特别的原因吗? - Russ J
在我看来,我可能会通过某种网络服务来完成这个任务,以便将繁重的工作放在您的服务器上而不是手机上,因为手机本身的资源有限。 - Russ J
  1. PDF有多大?如果PDF只有3-5页,这种情况也会发生吗?
  2. 它什么时候会将内存恢复到正常状态?当你的搜索完成后,它会立即恢复到正常使用吗?
  3. 提醒一下,虽然500是很多,但只要它回到以前的状态,那就没什么大不了的,因为当你的应用程序在后台运行时,它不会占用太多内存,因此不会再次启动。尽管这对其他应用程序来说可能不好,因为你的应用程序需要大约500MB的内存,并且需要关闭其他几个应用程序。
- mfaani
3个回答

3
感谢您的意见。需求是在客户端内部搜索 PDF 文件。在我的情况下,PDF 文件有大约 300 页,其中还包含图像。搜索完成后,直到 PDFDocument 被释放之前,内存使用量没有丝毫下降。当包含 PDFView 的屏幕被关闭时,通常会发生这种情况。我认为这是 PDFKit 进行的某种优化,它在搜索时对页面进行了索引。
我找到了一个解决方法,可以在不过多增加应用程序内存使用量的情况下正常工作。我的解决方案是每 x 页实例化一个新的 PDFDocument 对象。我解析了范围 nx ..< (n+1)x 中每个页面的文本,并搜索关键词。通过每个范围实例化一个新的 PDFDocument 对象,先前的对象和索引页面也被释放了。此外,每个页面的文本字符串可以缓存,这需要比 PDFKit 内部文档索引搜索时更少的内存。如果页面已经缓存,则以下次搜索几乎立即执行。
这个解决方案的性能结果很好。它还具有了解当前搜索进度的优点。这是因为您拥有当前范围和完成搜索所需的总范围数的信息。此外,该解决方案还可以通过在单独的线程中执行每个范围内的搜索来并行化。

非常聪明的解决问题的方式 - mfaani
你能展示给我“如何实例化一个新的PDFDocument对象并在每x页解析每个页面的文本”,如何从一个大PDFDocument中获取多个PDFDocument吗? - king wang

0
我会尝试在服务器端完成这个任务,因为那里有比你的手机更大的缓存容量和其他类似的资源。

0
如果字符串为空或非常小,请不要调用此方法,直接返回。

1
无论搜索词是什么,整个文档都会被索引。我有大约1000页的文档,其索引量超过1.2GB,这使得应用程序在某些设备上因内存问题而崩溃。此外,似乎不可能按页面包进行搜索,并在每次搜索之间删除索引缓存。 - Khorwin
如果我使用我的iPhone 5S,当它要处理大量任务时,也会出现卡顿的情况。500页是很多的。但只要内存回落,就应该没问题了。大多数新一代的iPhone都有2GB内存,不应该崩溃。基本上,苹果标准认为超过iPhone RAM一半以下的任何东西都可以接受。 - mfaani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接