【问题标题】:Efficient way to Parsing and manipulating string解析和操作字符串的有效方法
【发布时间】:2013-01-27 13:27:22
【问题描述】:

我不确定我是否正在使用有效的方式来处理大量字符串。 我需要打开一个大文件(~35kb)并解析和操作每一行,例如:

a1="Name surname"
a2="Name surname"
a3="Name surname"
...
a800="Name surname"

我需要将当前 id 作为索引的每个 Name surname 插入到 sqlite db 中。

while ((s = d.readLine()) != null){
                        String[] name = s.split("\"");

                        String[] arrIdTemp = s.split("=");
                        String[] arrtId = arrIdTemp[0].split("a");

                        db.execSQL("INSERT INTO " + Constant.DB.DB_NAME
                                + " Values ('" + arrtId[1] + "','" + name[1]
                                + "');");

                    }

通过这种方式,我创建了 3 个字符串数组,前 100 行非常快,但最后整个操作变慢了,可能是因为大量使用内存?有没有更好的解决方案来分割和操作每一行?

Logcat 输出说明了很多内容:

01-27 14:46:50.554: D/dalvikvm(2541): GC_CONCURRENT freed 1778K, 68% free 3606K/11079K, external 4662K/5822K, paused 4ms+7ms

【问题讨论】:

  • 在一个 SQL 命令中插入多个数据集。 => 更少的数据库调用,这应该会提高速度。
  • 顺便说一句,也不要像那样构造你的 SQL - 为值使用参数,而不是嵌入它们。
  • 您的建议是将所有参数(〜800键,值)保存在一个对象中,最后更新sql?
  • 首先使用拆分数据将文本文件加载到数组中,然后对于每个值对,将其写入数据库。通过这种方式,您将了解“减速”是由于文本文件加载还是数据库写入。我建议甚至 2 个进度条,以查看您的印象是否属实。发布此测试的结果,以便我们能够建议您解决方案(如果您仍然有问题)

标签: java android arrays string split


【解决方案1】:

[1° 解决方案]

我将这两个操作分开并使用事务。 从大约 60 秒开始,现在我只需要 2-3 秒。

这就是我所做的:

//List of query
ArrayList<String> queryList = new ArrayList<String>();
...
while ((s = d.readLine()) != null){
                        String[] name = s.split("\"");

                        String[] arrIdTemp = s.split("=");
                        String[] arrtId = arrIdTemp[0].split("a");

                        queryList.add("INSERT INTO " + Constant.DB.DB_NAME
                                + " Values ('" + arrtId[1] + "','" + name[1]
                                + "');");

                    }

...

if (queryList!=null && queryList.size()>0){
                Iterator<String> iter = queryList.iterator();
                db.beginTransaction();
                try {
                    while (iter.hasNext()) {
                         db.execSQL(iter.next());
                        }
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
            }

如果对我所做的事情有更好的解决方案或改进,请告诉我。

【讨论】:

猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2023-04-10
相关资源
最近更新 更多