Android是读取大型csv文件并将数据发送到服务器(不上传文件)的最有效方式

Android是读取大型csv文件并将数据发送到服务器(不上传文件)的最有效方式,android,json,performance,httprequest,out-of-memory,Android,Json,Performance,Httprequest,Out Of Memory,我的SD卡中有一个很大的csv文件,我想知道通过android应用程序将csv文件中的数据发送到托管服务器的最佳方式。我的应用程序将csv文件写入一个小时,然后在每小时结束时,我运行一个服务,读取此csv文件并将其发送到服务器 我最初没有向csv文件写入任何内容,而是将每个数据作为http post请求发送。但事实证明,我的应用程序显示了太多用于上传的数据 因此,我将数据写入一个文件长达一小时,并在一小时结束时读取每一行并将每个元组转换为json对象,将其放入json数组,然后通过名称-值对将该

我的SD卡中有一个很大的csv文件,我想知道通过android应用程序将csv文件中的数据发送到托管服务器的最佳方式。我的应用程序将csv文件写入一个小时,然后在每小时结束时,我运行一个服务,读取此csv文件并将其发送到服务器

我最初没有向csv文件写入任何内容,而是将每个数据作为http post请求发送。但事实证明,我的应用程序显示了太多用于上传的数据

因此,我将数据写入一个文件长达一小时,并在一小时结束时读取每一行并将每个元组转换为json对象,将其放入json数组,然后通过名称-值对将该数组作为json对象发送

问题1:

我的CSV文件太大,因此当我尝试向数组中添加2000多个json对象并按此方式发送时,会出现内存不足异常(问题发生在标记为**的行上)

添加(新的BasicNameValuePair(“myjson”,json_array_obj.toString()); 线程服务器=新线程(){ 字符串行=null; 公开募捐 { 试一试{ HttpClient httpclient1=新的DefaultHttpClient(); HttpPost httppost1=新的HttpPost(“http://www.example.com/filename.php"); **httppost1.setEntity(新的UrlEncodedFormEntity(nameValuePairs))** HttpResponse HttpResponse=httpclient1.execute(httppost1); HttpEntity HttpEntity=httpResponse.getEntity(); line=EntityUtils.toString(httpEntity); Log.e(“行”,行); } 捕获(例外e) { Log.v(“捕获”、“执行”); } } }; server.start(); Logcat显示:

`12-28 13:01:18.828: E/AndroidRuntime(2690FATAL EXCEPTION: Thread-16132
 12-28 13:01:18.828: E/AndroidRuntime(26908): java.lang.OutOfMemoryError
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at java.lang.StringBuilder.append(StringBuilder.java:216)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at libcore.net.UriCodec.appendHex(UriCodec.java:212)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at libcore.net.UriCodec.appendHex(UriCodec.java:206)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at libcore.net.UriCodec.appendEncoded(UriCodec.java:109)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at libcore.net.UriCodec.encode(UriCodec.java:133)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at java.net.URLEncoder.encode(URLEncoder.java:57)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at org.apache.http.client.utils.URLEncodedUtils.encode(URLEncodedUtils.java:184)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:163)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:71)
 12-28 13:01:18.828: E/AndroidRuntime(26908):   at com.example.acgylo.CSVtoServer$1.run(CSVtoServer.java:168)8): `
请帮我找到一个有效的解决上述问题的方法。感谢您的帮助


提前感谢。

流媒体是这里的神奇词汇。你不需要把所有的数据读入内存然后发送出去,你可以一个记录一个记录地进行

  • 打开HTTP post连接
  • 写开场白“[”
  • 从CSV文件中读取记录并将其转换为JSON
  • 通过行发送JSON字符串
  • 发送“分离JSON数组中的对象”命令
  • 重复步骤3-5,直到发送所有数据为止(在最后一条记录后,省略“,”
  • 发送结束数组的“]”
  • 完成HTTP请求

  • 正如您所提到的,如果要从移动设备向服务器发送大量数据,您可以

    a) 将数据分解为多个部分,如果这些部分之间没有依赖关系,则可以工作


    b) 只需将数据压缩成zip文件并发送到服务器即可。在大多数情况下,只需修改服务器以接受zip文件,然后进行常规处理可能会更容易

    您可以修改服务器端以接受zip文件吗?每个请求中都有少量开销,以及发送JSON的(轻微)协议开销,这意味着简单地将较大的请求分解为较小的请求可能会增加带宽使用,而不是减少带宽使用。OOM在你的客户端-你不能增加可用内存吗?不,我不能,因为它是一个php文件,将每个元组插入数据库。我不知道如何增加客户端的内存。它不依赖于手机内存吗?这是我的第一个android应用程序,所以我对itI不是很熟悉。我在这里读到了这个json问题:你的句子中的“发送”一词是指通过http post发送?或者您的意思是附加对象,然后一起发送?在步骤1中,只需打开连接并从中获取输出流(参见示例)。Send表示将字符写入流。因此,整个阵列仅在一个HTTP请求中发送。非常感谢!我只是在做这件事……希望这能奏效。我无法实现这个方法。我最终发送了文件本身,现在工作正常了。谢谢!哦,太好了!!我也会继续尝试!!非常感谢。
    One http request with large json object sent as string OR Multiple http requests with smaller json objects?