Проблема "Открыто слишком много файлов", используемая FMDatabase/SQLite3

Я использую оболочку FMDatabase для SQLite3 в моем приложении OSX. Я делаю тонны вставок в базу данных:

FMResultSet *results;
results= [db executeQuery:@"select count(*) from `items` where key = ?",[keyPath lowercaseString],nil];

while([results next])
{
    if([results unsignedLongLongIntForColumnIndex:0]>0){
        updateOperation=TRUE;
    }
}
[results close];

if(updateOperation){

    [db executeUpdate:@"update `items` set OSXsize=?,OSXOsize=?, OSXDate=?, UUID=?,sourceFile=?,tombStone=0,SandBoxBookMark=?,songname=?,albumartist=? where key=?",
     size,originalSize, convertedDate,UUID,sourcePath,bookmark,fileName,albumArtist,[keyPath lowercaseString] , nil];
}
else
{
    [db executeUpdate:@"insert into `items`(key,filepath, OSXsize, OSXOsize, OSXdate,UUID,sourceFile,tombStone,SandBoxBookMark,songname,albumartist) values(?,?,?,?,?,?,?,0,?,?,?)",
     [keyPath lowercaseString], dapPath, size,originalSize, convertedDate,UUID,sourcePath,bookmark,fileName,albumArtist, nil];
}

Я открываю базу данных один раз, однако, я вижу 4725+ файловых дескрипторов, прикрепленных по мере продвижения приложения в мониторе активности:

/Users/userA/Library/Containers/com.map-pin.Dapper/Data/Library/Application Support/com.map-pin.Dapper/dapperright.sqlite
15
16
...
4724
4725

2 ответа

Решение

Это в многопоточном приложении, и вы создаете и открываете db экземпляр каждый раз, когда вы обновляете / вставляете строку? У тебя есть [db close]; где-то?

Вы тестировали FMDatabaseQueue?

Для пользователя, который запускает вашу базу данных, выполните следующую команду:

limit maxfiles 4096 16384 

После этого перезапустите базу данных. Теперь он должен уметь обрабатывать 16 тыс. Файлов.

То, как вы сохраните это для перезагрузки OS X, зависит от версии OS X. Вы найдете это, ища в вашей любимой поисковой системе

Другие вопросы по тегам