gpt4 book ai didi

java - 优化/并发 JAVA : reading CSV file, 解析数据以加倍然后对值进行计算

转载 作者:行者123 更新时间:2023-11-30 09:44:34 24 4
gpt4 key购买 nike

我正在使用 Java 编写数据分析程序。数据来自汽车传感器,并以 CSV 格式提供。它需要读取、解析成两倍然后“转换”(比如从 5/12 伏特值到 G-forces/mph/% throttle 开度/% 制动力等)。数据文件的大小将达到约 200MB。

我目前正在做的是使用 BufferedReader 读取数据,使用 indexOf() 和 substring() 拆分 tokenz,使用 parseDouble 将它们解析为 double ,将它们添加到具有 double 的 ArrayLists 的 ArrayList(每个 ArrayList代币,最多约有 20 个代币)。制作数组列表后,我必须转换 double ,这意味着对每个值使用多项式(这似乎占用了大部分时间,超过 2/3)。

对于包含 20 个标记的 240 000 行样本数据,整个序列大约需要 7 秒。我想知道如何改进这一点。我一直在考虑使用流和并发进行文件读取和解析,但似乎最大的问题是多项式数学。我用来计算转换值的代码是:

pol0 + pol1 * value + pol2 * Math.pow(value, 2) + pol3 * Math.pow(value, 3)
+ pol4 * Math.pow(value, 4);

其中 polX 是多项式,value 是我正在转换的 double 值。这当然会有所不同,具体取决于我有多少多项式可用。

那么,这有任何意义吗?如果是这样,关于如何改进此过程的性能有什么建议吗?

感谢这个拥有许多有用用户的好网站。 :-)

最佳答案

Math.pow(value, 2) 非常昂贵。这使用 log + exp。相反,您可以使用速度更快的普通乘法。

double value2 = value * value;
double value3 = value * value2;
double value4 = value2 * value2;
double p = pol0 + pol1 * value + pol2 * value2 + pol3 * value3
+ pol4 * value4;

另一种方法是边做边乘

double p = (((pol4 * value + pol3) * value + pol2) * value + pol1) * value + pol0;

double 的 ArrayLists 是一种昂贵的结构(主要是开销)。它比 double[] 大几倍。

例如

double[] buffer = new double[1024];
List<double[]> list = new ArrayList<>():
while((line = ....) {
int used = 0;
// found a double
buffer[used++] = Double.parseDouble();
double[] doubles = new double[used];
System.arraycopy(buffer,0,doubles,0,used);
list.add(doubles);
}

关于java - 优化/并发 JAVA : reading CSV file, 解析数据以加倍然后对值进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850042/

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