2011-12-14 87 views
1

我在android应用程序中从服务器(20 MB)逐行读取大文本文件, 在每行向sqlite DB插入一些从此行提取的数据之后等等。从服务器读取大文本文件android

问题是,这个应用程序大约需要一个小时才能完成读取这个文件。 说明: 此文件中有400,000行。

我该如何快速执行此操作需要3到4分钟? 感谢您的帮助。

public void readArData() { 
    try { 
     URL url = new URL("http://10.0.2.2/xy.txt"); 
     BufferedReader in = new BufferedReader(new 
    inputStreamReader(url.openStream())); 
     String str; 
     while ((str = in.readLine()) != null) { 
      // insert into Sqlite DB 
     } 
     in.close(); 
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 

} 

回答

1

文本文件是高度可压缩的,所以使用Android上提供的gzip压缩。

其他选项包括:

  • 分裂您的数据集分为多个文件,再次使用gzip单独下载

  • 期间播种的数据库安装并创建一个同步方法来更新新的记录,并把移动版本是最新的。\

  • 使用高效的数据库设计删除冗余数据,只下载需要的内容

UPDATE

澄清:

  1. 压缩服务器上的txt文件。
  2. 更改您的android代码以将zip文件下载到设备上的本地存储。
  3. 将本地副本解压缩到本地存储。

您现在应该在本地存储器上有一个txt文件的副本,以便您可以删除本地zip文件。

  1. 读取本地txt文件并插入数据库记录。

这种方法的主要区别是

一个。您正在下载更少的数据 b。你的下载不会被sql插入中断。

您也可以尝试使用事务,以提高插入速度为Android SQLite database: slow insertion

描述
db.beginTransaction(); 
for (entry : listOfEntries) { 
    db.insert(entry); 
} 
db.setTransactionSuccessful(); 
db.endTransaction(); 
+0

好吧,我会尝试这个,但从内部存储读取比从服务器读取更快?意味着两个操作(从内部存储或从服务器读取)有很大的不同? – 2011-12-14 22:23:57

2

你确定3 - 4分钟是可以达到的时间量吗?我问,因为你必须:

1)下载该文件的内容 2)分析文件内容, 3)插入到数据库

一些操作可同时进行,但#1是高度依赖于网络速度和2/3高度依赖于你有什么样的系统资源。

相反,我们可以问为什么需要将所有这些数据放到手机中并放到数据库中?您的应用程序是否存在与托管在包含.txt的网络服务器上的数据库相关的问题?你有什么样的访问.txt文件?你可以在服务器上修改它,以便解析可以更快完成?

总之,我认为我们需要更多数据来分析您的问题。你可以发布一些.txt文件的例子和你用来解析它的代码吗?

+1

您可能需要考虑预处理服务器上的文件,然后将其复制到手机上。我认为可以将满载的SQLite数据库从服务器复制到手机上。 – zostay 2011-12-14 21:58:48

+1

+1,如果你有400,000行并希望在4分钟内完成,那么每分钟就有10万次SQL插入,每秒1666次。似乎需要从移动设备上询问很多,特别是如果您还必须进行某种字符串处理。 – kabuko 2011-12-14 22:01:07

0
  1. 确保你的空间在20MB内部存储或SD卡。
  2. 一次下载文件,如果压缩更好。 (因为它会重约3-4mb)
  3. 然后你可以打开它并解析它。使用插入多于一次的查询(检查INSERT sqlite语法)。
  4. 删除该文件。

这种方法也可以让你恢复中断的下载,这并不坏。

相关问题