gpt4 book ai didi

java - 使用 Java 访问数据集的最快方法是什么?

转载 作者:行者123 更新时间:2023-11-29 06:24:10 24 4
gpt4 key购买 nike

我有一个大文件,其中包含 180 万行数据,我需要能够读取我正在编写的机器学习程序。数据目前在 CSV 文件中,但显然我可以根据需要将其放入数据库或其他结构中 - 它不需要定期更新。

我目前使用的代码如下。我首先将数据导入数组列表,然后将其传递给表模型。这非常慢,目前只需要 6 分钟来执行前 10,000 行,这是 Not Acceptable ,因为我需要能够相当频繁地针对数据测试不同的算法。

我的程序只需要访问每一行数据一次,因此无需将整个数据集保存在 RAM 中。我是从数据库中读取更好,还是有更好的方法逐行读取 CSV 文件但速度更快?

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class CSVpaser {

public static TableModel parse(File f) throws FileNotFoundException {
ArrayList<String> headers = new ArrayList<String>();
ArrayList<String> oneDdata = new ArrayList<String>();
//Get the headers of the table.
Scanner lineScan = new Scanner(f);
Scanner s = new Scanner(lineScan.nextLine());
s.useDelimiter(",");
while (s.hasNext()) {
headers.add(s.next());
}

//Now go through each line of the table and add each cell to the array list
while (lineScan.hasNextLine()) {
s = new Scanner(lineScan.nextLine());
s.useDelimiter(", *");
while (s.hasNext()) {
oneDdata.add(s.next());
}
}
String[][] data = new String[oneDdata.size()/headers.size()][headers.size()];
int numberRows = oneDdata.size()/headers.size();

// Move the data into a vanilla array so it can be put in a table.
for (int x = 0; x < numberRows; x++) {
for (int y = 0; y < headers.size(); y++) {
data[x][y] = oneDdata.remove(0);
}
}

// Create a table and return it
return new DefaultTableModel(data, headers.toArray());


}

更新:根据我在答案中收到的反馈,我重写了代码,它现在运行 3 秒而不是 6 分钟(对于 10,000 行),这意味着整个文件只需 10 分钟......但是关于如何加速的任何进一步建议不胜感激:

       //load data file
File f = new File("data/primary_training_short.csv");
    Scanner lineScan = new Scanner(f);
Scanner s = new Scanner(lineScan.nextLine());
s.useDelimiter(",");

//now go through each line of the results
while (lineScan.hasNextLine()) {
s = new Scanner(lineScan.nextLine());
s.useDelimiter(", *");
String[] data = new String[NUM_COLUMNS];

//get the data out of the CSV file so I can access it
int x = 0;
while (s.hasNext()) {
data[x] = (s.next());
x++;
}
//insert code here which is excecuted each line
}

最佳答案

data[x][y] = oneDdata.remove(0);

那将是非常低效的。每次从 ArrayList 中删除第一个条目时,所有其他条目都需要向下移动。

至少您需要创建一个自定义 TableModel,这样您就不必复制数据两次。

如果您想将数据保存在数据库中,请在网上搜索 ResultSet TableModel。

如果您想将其保存为 CSV 格式,则可以使用 ArrayList 作为 TableModel 的数据存储。因此您的扫描程序代码会将数据直接读取到 ArrayList 中。参见 List Table Model对于一个这样的解决方案。或者您可能想使用 Bean Table Model .

当然,真正的问题是谁有时间浏览所有 180 万条记录?因此,您确实应该使用数据库并具有查询逻辑来过滤从数据库返回的行。

My program will only need to access each row of the data once, so there's no need to hold the whole dataset in RAM

那么为什么要在 JTable 中显示它?这意味着整个数据将在内存中。

关于java - 使用 Java 访问数据集的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5684158/

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