【发布时间】:2014-01-09 05:22:50
【问题描述】:
我创建了一种方法来根据从服务器获得的 Http 响应填充数组。我以简单的格式收到回复并使用扫描仪阅读。响应只有大约 8000 个条目(浮点数和整数),填充 ArrayList 需要很长时间,大约需要 1 或 2 分钟。这是代码
public void update(String str) {
ProgressDialog pDialog = new ProgressDialog(context);
pDialog.setMessage("Atualizando pesos, aguarde");
pDialog.show();
BufferedReader r = new BufferedReader(new StringReader(str));
Scanner s = null;
try{
s = new Scanner(r);
ArrayList<ArrayList<ArrayList<Double> > > weights = new ArrayList<ArrayList<ArrayList<Double> > >();
while(s.hasNextInt()){
ArrayList<ArrayList<Double> > wl = new ArrayList<ArrayList<Double> >();
int layerId = s.nextInt(), neuronsAmt = s.nextInt(), inputSize = s.nextInt();
Log.d("UpdateTask", "Layer " + layerId + ", neuronios: " + neuronsAmt + ", inputSize: " + inputSize);
for(int i = 0; i < neuronsAmt; i++){
ArrayList<Double> wi = new ArrayList<Double>();
for(int j = 0; j < inputSize; j++){
wi.add(s.nextDouble());
}
wl.add(wi);
}
weights.add(wl);
this.weights = weights;
if(s.hasNext() && !s.hasNextInt())
Log.d("UpdateTask", "Depois de tudo tem " + s.next());
}
}finally{
if( s != null) s.close();
pDialog.dismiss();
}
}
我在收到 HTTP 响应后从 AsyncTask 调用它。
编辑:我将尝试在此处解释 HTTP 结构。响应实际上给出了神经网络的权重。基本上它是一个矩阵数组(应该保留为矩阵,以便神经网络的评估工作)。 HTTP 响应如下: 有N个矩阵。每一个都以一个整数(矩阵 ID)开头,然后是矩阵中的行数(R)和列数(C)。之后,有 R*C 浮点数表示存储在矩阵中的值。当您找不到另一个图层 id 时,输入将终止。
PS:我也无法让对话框工作,但现在这对我来说不是问题。
【问题讨论】:
-
你为什么使用 ArrayList
>>? -
它实际上是一个矩阵数组(这些是我正在尝试做的神经网络中的权重)。我只是不知道更好的方法(我刚开始用 Java 编写代码)。
-
嗯,我不知道确切的效果,但我可以想象这非常低效。
-
发布(结构)来自 HTTP 请求的响应。你的储蓄方式看起来效率很低。
-
真的需要
weights和this.weights;不能直接加this一个吗?
标签: java android performance arraylist io