gpt4 book ai didi

java - Android 填充 ArrayList 时的性能问题

转载 作者:行者123 更新时间:2023-12-01 13:41:41 24 4
gpt4 key购买 nike

我创建了一个方法来根据从服务器获得的 Http 响应来填充数组。我收到简单格式的回复并使用扫描仪读取它。响应只有大约 8000 个条目( float 和整数),并且填充 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 float 表示存储在矩阵中的值。当找不到另一个图层 id 时,输入将终止。

PS:我也无法使对话框正常工作,但这对我来说现在不是问题。

最佳答案

考虑简化数组结构,即尽可能使用随意的array。如果可能的话,还要用容量初始化ArrayList(如leandrocastelli提到的)。例如,您的代码可能会这样优化:

    ...

try {
s = new Scanner(r);
ArrayList<double[][]> weights = new ArrayList<double[][]>(); // capacity is highly recommended here, even approximate
while(s.hasNextInt()){

int layerId = s.nextInt(), neuronsAmt = s.nextInt(), inputSize = s.nextInt();
double[][] wl = new double[neuronsAmt][]; // just 2D-array of doubles, which is much faster than List of List

Log.d("UpdateTask", "Layer " + layerId + ", neuronios: " + neuronsAmt + ", inputSize: " + inputSize);
for(int i = 0; i < neuronsAmt; i++){
double[] wi = new double[inputSize];
for(int j = 0; j < inputSize; j++){
wi[j] = s.nextDouble();
}
wl[i] = wi;
}
weights.add(wl);
this.weights = weights;
if(s.hasNext() && !s.hasNextInt())
Log.d("UpdateTask", "Depois de tudo tem " + s.next());
}
}
...

关于java - Android 填充 ArrayList 时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702071/

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