gpt4 book ai didi

快速将多个图像一次保存到文件系统,CPU 高

转载 作者:行者123 更新时间:2023-11-30 10:44:55 30 4
gpt4 key购买 nike

我有以下功能,我需要清除数据库中的所有图片列并移动到文件系统。当我一次性完成这一切时,内存太多并且会崩溃。我切换到递归函数并执行 20 次写入和批量操作。

我需要为大约 6 个表执行此操作。我的 Realm DB 中有 2 个半千兆的数据。在我调用 6 个递归函数、取出图像并压缩 Realm 后,它会切换到 40mb。

我可以看到非常高的内存使用量,因为我的函数被调用,而 RAM 较少的手机将无法处理它。

如何在每个函数之间释放内存和 CPU?

public static func clearEqCatPics(){

let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let eqcatPicDir = docsDir.appendingPathComponent(util_Constants.DIR_EQCAT_PICS)

do {
var realm : Realm? = try Realm()
let predicate = NSPredicate(format: "icon != %@", "")
let categories = realm!.objects(STD_EQ_category.self).filter(predicate).sorted( by: [SortDescriptor(keyPath: "displayorder", ascending: true), SortDescriptor(keyPath: "_id", ascending: true)] )

if (categories.count > 0)
{
realm?.beginWrite()
let upper = categories.count > 20 ? 20 : categories.count

var actualCounter = upper
for i in 0..<upper{
autoreleasepool{
if let proPicData = Data(base64Encoded: categories[actualCounter - 1].icon, options: .ignoreUnknownCharacters) {


let filename = eqcatPicDir.appendingPathComponent(categories[actualCounter - 1]._id.description+".jpg")

(proPicData as NSData).writeToURL2(named: filename, completion: { (result, url) -> Void in

})

categories[actualCounter - 1].icon = ""

}
else{
categories[actualCounter - 1].icon = ""
}
}

actualCounter = actualCounter - 1

}

try realm?.commitWrite()
let eqcatNew = realm!.objects(STD_EQ_category.self).filter(predicate)
print("$$$$$$$$$$$$$$$$$$$$ 2. eqcatNew COUNT : \(eqcatNew.count) $$$$$$$$$$$$$$$$$$$$")
realm = nil
if eqcatNew.count > 0 {
clearEqCatPics()
}
}
realm = nil
}
catch let error as NSError {
print("error realm \(error.localizedDescription)")

}

}

其中 writeToURL2 是:

我需要摆脱扩展中的弱 self ,因为我正在通过多个项目的守卫,并且负载被跳过

extension NSData {

func writeToURL2(named:URL, completion: @escaping (_ result: Bool, _ url:NSURL?) -> Void) {


let tmpURL = named as NSURL

//[weak self]
DispatchQueue.global(qos: .background).async { () -> Void in

//guard let strongSelf = self else { print("self was weak"); completion (false, tmpURL); return }

self.write(to: tmpURL as URL, atomically: true)
var error:NSError?
if tmpURL.checkResourceIsReachableAndReturnError(&error) {
print("We have it")
completion(true, tmpURL)
} else {
print("We Don't have it\(error?.localizedDescription)")
completion (false, tmpURL)
}

}

}
}

编辑:

我将 for 循环中的 writeToURL 更改为以下内容:

do {
try proPicData.write(to: filename, options: [.atomic])
}
catch let err as NSError{
print("err : \(err.localizedDescription)")
}

它有助于内存,但有时我会得到 Thread1: EXC_BAD_ACCESS 指向该行 try proPicData.write...

CPU 使用率仍然很高。是否有办法清除每个函数调用之间的 CPU 使用情况?

最佳答案

您同时获取Realm中的所有对象,这就是消耗大量内存的原因

让类别= Realm !.objects(STD_EQ_category.self).filter(predicate).sorted( by: [SortDescriptor(keyPath: "displayorder", 升序: true), SortDescriptor(keyPath: "_id",升序:true)])

写入文件并不是消耗内存的原因,尽管这可能与 CPU 使用率有关。

我建议对类别获取设置限制,这样您就不会将所有类别及其图像加载到内存中。否则,尝试提出一个获取谓词,否则将以合理的方式限制数据。

关于快速将多个图像一次保存到文件系统,CPU 高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55932996/

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