1

SQLiteデータベースで一括挿入を実行するループを反復処理しているときに、メモリベースの厳密な問題が発生しています。

私はこれがメモリに関係していると確信しており、問題を引き起こしている変数を指摘することはできません。確認できる範囲で割り当てられたものをすべて解放しました。

機器を介して分析されたこの時点まで、メモリリークはありません。コードのスニペットは次のとおりです。

int m=0;

while ([arrData count]!=0) {

if (newQuery) {

    exeQuery = query;
    newQuery = false;

}
else 
{
    exeQuery=[exeQuery stringByAppendingFormat:@" UNION"];
}

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithDictionary:[arrData objectAtIndex:0]];

[data removeObjectForKey:@"statement"];
[data removeObjectForKey:@"datetime_stamp"];

NSString *strVal=@"";
NSString *_value=@"";

int i=0;
    for(;i<[keys  count]-1;i++)
    {
        if(_value==nil || _value==NULL){
            _value=@"";
        }

        _value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
        _value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

        strVal=[strVal stringByAppendingFormat:@"'%@',",_value];

    }

if(_value==nil || _value==NULL){
    _value=@"";
}

_value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
_value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

strVal=[strVal stringByAppendingFormat:@"'%@'",_value];


exeQuery=[exeQuery stringByAppendingFormat:@" SELECT %@",strVal];


if (m!=0 && m%499==0) {

    [DataSource executeQuery:exeQuery];

    //db.execute(exeQuery);
    newQuery = true;
}

[data release];

[arrData removeObjectAtIndex:0];

m++;
}

for (;m<locations_length; m++) {

if (newQuery) {

    exeQuery = query;
    newQuery = false;

}
else 
{
    exeQuery=[exeQuery stringByAppendingFormat:@" UNION"];
}

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithDictionary:[arrData objectAtIndex:m]];

[data removeObjectForKey:@"statement"];
[data removeObjectForKey:@"datetime_stamp"];

NSString *strVal=@"";
NSString *_value=@"";

int i=0;
    for(;i<[keys  count]-1;i++)
    {
        if(_value==nil || _value==NULL){
            _value=@"";
        }

        _value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
        _value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

        strVal=[strVal stringByAppendingFormat:@"'%@',",_value];

    }

if(_value==nil || _value==NULL){
    _value=@"";
}

_value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
_value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

strVal=[strVal stringByAppendingFormat:@"'%@'",_value];


exeQuery=[exeQuery stringByAppendingFormat:@" SELECT %@",strVal];


if (m!=0 && m%499==0) {

    [DataSource executeQuery:exeQuery];

    //db.execute(exeQuery);
    newQuery = true;
}

[data release];
}

どんな助けでも大歓迎です。Plzが手を組む..!

前もって感謝します。

4

3 に答える 3

1

インスタンスごとに変更される文字列を使用していることは明らかであるため、nsmutablestring は最適化されたソリューションです。また、関数の分析中:

[NSMutableString replaceOccurrencesOfString:@"'" withString:@"''"]
[NSMutableString  appendString:]

インストゥルメントでは、以前に使用したものと比較して、メモリフットプリントが少なくなります。

于 2012-08-25T09:18:14.683 に答える
1

[keys count] で何回繰り返しているかを知らずに、多くの NSString 操作を行っています。各「stringBy...」メッセージは、ループを終了するまで解放されない、自動解放された新しい NSString インスタンスを割り当てます。代わりに NSMutableString を使用し、

replaceOccurrencesOfString:withString:options:range:

作成している自動解放オブジェクトの数を減らすため (これにより、アプリケーションのメモリ フットプリントが削減されます)。NSMutableStringのドキュメントを参照してください。それ以外の場合は、Allocations ツールまたは Xcode で同様のものを使用して、メモリ フットプリントを詳しく調べることをお勧めします。

于 2012-08-21T12:27:28.097 に答える
0

SqliteまたはCoreDataを使用してデータベースにレコードを一括挿入する場合は、常に@autoreleasepool {}でループを使用することをお勧めします。これにより、自動リリースモードのすべてのオブジェクトがすぐに使用されるとnilになります。

int m=0;

while ([arrData count]!=0) {

@autoreleasepool{

if (newQuery) {

    exeQuery = query;
    newQuery = false;

}
else 
{
    exeQuery=[exeQuery stringByAppendingFormat:@" UNION"];
}

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithDictionary:[arrData objectAtIndex:0]];

[data removeObjectForKey:@"statement"];
[data removeObjectForKey:@"datetime_stamp"];

NSString *strVal=@"";
NSString *_value=@"";

int i=0;
    for(;i<[keys  count]-1;i++)
    {
        if(_value==nil || _value==NULL){
            _value=@"";
        }

        _value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
        _value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

        strVal=[strVal stringByAppendingFormat:@"'%@',",_value];

    }

if(_value==nil || _value==NULL){
    _value=@"";
}

_value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
_value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

strVal=[strVal stringByAppendingFormat:@"'%@'",_value];


exeQuery=[exeQuery stringByAppendingFormat:@" SELECT %@",strVal];


if (m!=0 && m%499==0) {

    [DataSource executeQuery:exeQuery];

    //db.execute(exeQuery);
    newQuery = true;
}

[data release];

[arrData removeObjectAtIndex:0];

m++;
}

for (;m<locations_length; m++) {

if (newQuery) {

    exeQuery = query;
    newQuery = false;

}
else 
{
    exeQuery=[exeQuery stringByAppendingFormat:@" UNION"];
}

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithDictionary:[arrData objectAtIndex:m]];

[data removeObjectForKey:@"statement"];
[data removeObjectForKey:@"datetime_stamp"];

NSString *strVal=@"";
NSString *_value=@"";

int i=0;
    for(;i<[keys  count]-1;i++)
    {
        if(_value==nil || _value==NULL){
            _value=@"";
        }

        _value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
        _value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

        strVal=[strVal stringByAppendingFormat:@"'%@',",_value];

    }

if(_value==nil || _value==NULL){
    _value=@"";
}

_value=[NSString stringWithFormat:@"%@",[data objectForKey:[keys objectAtIndex:i]]];
_value=[_value stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

strVal=[strVal stringByAppendingFormat:@"'%@'",_value];


exeQuery=[exeQuery stringByAppendingFormat:@" SELECT %@",strVal];


if (m!=0 && m%499==0) {

    [DataSource executeQuery:exeQuery];

    //db.execute(exeQuery);
    newQuery = true;
}

[data release]; 

}


}
于 2012-08-21T11:44:13.443 に答える