gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:52:31 26 4
gpt4 key购买 nike

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

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

所以我转而将数据写入文件一个小时,并在一小时结束时读取每一行并将每个元组转换为 json 对象,将其放入一个 json 数组,然后将该数组作为 json 对象通过名称值对。

问题一:

我的 CSV 文件太大,所以当我尝试向数组添加超过 2000 个 json 对象并像这样发送时,出现内存不足异常(问题发生在标有 ** 的行上)

nameValuePairs.add(new BasicNameValuePair("myjson", json_array_obj.toString()));

Thread server = new Thread(){
String line = null;
public void run()
{
try{

HttpClient httpclient1 = new DefaultHttpClient();
HttpPost httppost1 = new HttpPost("http://www.example.com/filename.php");


**httppost1.setEntity(new UrlEncodedFormEntity(nameValuePairs));**
HttpResponse httpResponse = httpclient1.execute(httppost1);

HttpEntity httpEntity = httpResponse.getEntity();
line = EntityUtils.toString(httpEntity);

Log.e("line" , line);
}
catch(Exception e)
{
Log.v("catch", "executed");
}

}
};
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): `

然后我发现json数组有大量的对象不能作为namevaluepair发送,因为它会导致内存溢出。

所以我想知道最好的方法是什么:

选项 1:以 500 个为一组发送数据(即一起发送 500 行 csv)。

有没有其他有效的方法可以在 android 中通过 HTTP 从 CSV 发送 2k 元组(或更多)?

问题2:

a) 我想知道如何减少 android 应用程序的数据使用?

b) 什么使用更少的数据:

One http request with large json object sent as string OR Multiple http requests with smaller json objects?

请帮我找到解决上述问题的有效方法。任何帮助表示赞赏。

提前致谢。

最佳答案

流媒体是这里的魔法词。无需将所有数据读入内存然后将其发送出去,您可以逐条记录地进行。

  1. 打开 HTTP post 连接
  2. 写开头“[”
  3. 从CSV文件中读取记录并将其转换为JSON
  4. 在线发送 JSON 字符串
  5. 发送","分隔JSON数组中的对象
  6. 重复步骤 3-5 直到发送完所有数据(在最后一条记录后省略“,”)。
  7. 发送数组结尾的“]”
  8. 完成 HTTP 请求

关于Android读取大型csv文件并将数据发送到服务器的最有效方法(不上传文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com