0

私はアプリケーションを持っていて、それにかなり大きなSQLiteデータベース(約5000行の1つのテーブル)をセットアップしようとしています。DBクラスとすべてを構築しました。小規模(400行)でテストしたときにアプリは機能しますが、データベースをインポートしたいときに、見つからないように見えるメモリ不足エラーが発生します。回避する方法。

データベースは最初は私のWebサーバー上のMySQLにあり、奇妙な理由で変換できませんでしたが、クエリを含むテキストファイルを生成して、サイズが11.5MBの5000行すべてを追加することができました。このファイルはアセットフォルダーにあり、DBに配置しようとしています。

public void onHandleIntent(Intent intent) {

        DBAdapter db = new DBAdapter(getApplicationContext());
        db.open();

        try {
            InputStream is = getAssets().open("verbs_sql.txt");
            db.executeSQL(convertStreamToString(is));
        } catch (IOException e) {}

        db.close();

        // Run main activity
        Intent i = new Intent(DatabaseReceiver.this, BaseActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        DatabaseReceiver.this.startActivity(i);
    }

    public static String convertStreamToString(InputStream is) throws IOException {
        Writer writer = new StringWriter();

        char[] buffer = new char[2048];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        String text = writer.toString();
        return text;
    }
}

StringWriter()でメモリ不足エラーが発生するため、その大きなファイルをメモリに配置しているように見えます。どうすればこれを解決できますか?また、5000行すべてをループしようとしましたが、おそらく30秒後に再びメモリが不足しました。

4

3 に答える 3

1

私も同じ問題を抱えていました。私はそれを解決するためにたくさんの方法を試しましたが失敗しました。とうとう理由を見つけて疑問に思いました。私の場合、エラーの理由は、応答文字列全体をlogcatに出力していたことです。そのデータは非常に膨大で、ヒープメモリが必要でした。次のことに注意してください

  1. バルクデータのログキャット印刷を削除します。
  2. 1つの共鳴の下ですべての操作に1つのJ-SONアレイのみを使用するようにしてください(すべてに再利用してください)。
  3. 配列リストの使用は避けてください。
  4. 各アイテムがJ-SonArrayから反復するときに、アイテムを挿入します。つまり、アイテムをオブジェクトとして取得し、それを配列リストに入れて配列リストをDBヘルパーに渡し、そこからオブジェクトを繰り返して挿入する方法に従わないでください。
于 2015-02-03T11:29:04.330 に答える
0

Sqliteデータベースは単なるファイルであり、電話で何千もの挿入を実行しようとすると、ファイルアクセスのためにSDカードを何度も叩きます。

デスクトップにsqliteデータベースを作成し、作成済みのデータベースをアプリに含めます。データベース内の情報を定期的に更新する必要がある場合は、Webサイトに投稿してアプリにダウンロードさせることができます。必ず、Wi-Fi経由で大規模なダウンロードのみを行ってください。

詳細については、このTechTalkをご覧ください。

編集:Windowsでsqliteデータベースを作成し、それをアプリに含める方法の詳細については、こちらをご覧ください。

于 2012-06-03T01:50:59.257 に答える
0

私はあなたがあなたが望む方法でこれを行うことができると信じています。投稿したコードの問題は、ファイル全体を文字列に変換しようとしていることです。デスクトップマシンでもこれは失敗するだろうと私はかなり確信しています。

一度に1行ずつ読んでSQLを実行しようとすると、運が良くなると思います。次に、次の行を読みます。zipを介してファイルを渡すことにより、ファイルのサイズを縮小することもできます。

数分あれば、コードを添付します。

于 2012-06-03T02:03:35.107 に答える