"Too many files open" FMDatabase/SQLite3 使用的问题
"Too many files open" issue used by FMDatabase/SQLite3
我在我的 OSX 应用程序中使用 SQLite3 的 FMDatabase 包装器。我在数据库中做了很多插入操作:
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];
}
我打开数据库一次,但是,随着应用程序的运行,我在 activity 监视器中看到附加了 4725+ 个文件句柄:
/Users/userA/Library/Containers/com.map-pin.Dapper/Data/Library/Application Support/com.map-pin.Dapper/dapperright.sqlite
15
16
...
4724
4725
对于运行您的数据库的用户,运行以下命令:
limit maxfiles 4096 16384
之后重启数据库。现在它应该能够处理 16k 个文件。
如何在 OS X 重新启动时保持此设置取决于 OS X 的版本。您可以通过在您最喜欢的搜索引擎中搜索来找到它
这是在多线程应用程序中吗?您是否每次 update/insert 连续创建并打开一个 db
实例?你有[db close];
吗?
你测试过FMDatabaseQueue了吗?
我在我的 OSX 应用程序中使用 SQLite3 的 FMDatabase 包装器。我在数据库中做了很多插入操作:
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];
}
我打开数据库一次,但是,随着应用程序的运行,我在 activity 监视器中看到附加了 4725+ 个文件句柄:
/Users/userA/Library/Containers/com.map-pin.Dapper/Data/Library/Application Support/com.map-pin.Dapper/dapperright.sqlite
15
16
...
4724
4725
对于运行您的数据库的用户,运行以下命令:
limit maxfiles 4096 16384
之后重启数据库。现在它应该能够处理 16k 个文件。
如何在 OS X 重新启动时保持此设置取决于 OS X 的版本。您可以通过在您最喜欢的搜索引擎中搜索来找到它
这是在多线程应用程序中吗?您是否每次 update/insert 连续创建并打开一个 db
实例?你有[db close];
吗?
你测试过FMDatabaseQueue了吗?