0

在 Java 中,下面是读取带有整数表的文件的代码:

public static int[][] getDataset() {

    // open data file to read n and m size parameters
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(filePath));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // count the number of lines
    int i = -1;
    String line = null, firstLine = null;
    do {

        // read line
        try {
            line = br.readLine();
            i++;
            if (i == 0) firstLine = line;
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

    } while (line != null);

    // close data file
    try {
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // check the data for emptiness
    if (i == 0) {
        System.out.println("The dataset is empty!");
        System.exit(1);
    }

    // initialize n and m (at least the first line exists)
    n = i; m = firstLine.split(" ").length;
    firstLine = null;

    // open data file to read the dataset
    br = null;
    try {
        br = new BufferedReader(new FileReader(filePath));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // initialize dataset
    int[][] X = new int[n][m];

    // process data
    i = -1;
    while (true) {

        // read line
        try {
            line = br.readLine();
            i++;
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        // exit point
        if (line == null) break;

        // convert a line (string of integers) into a dataset row
        String[] stringList = line.split(" ");
        for (int j = 0; j < m; j++) {
            X[i][j] = Integer.parseInt(stringList[j]);
        }

    }

    // close data file
    try {
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    return X;

}

数据集大小参数nm的类型static final int和声明在外部以及static final String filePath.

我给你我的解决方案(也许对以后阅读本文的新手有用)并询问是否有可能使其在时间上更快和/或消耗更少的内存?我对完美的微优化很感兴趣,任何建议在这里都会很棒。特别是我不喜欢文件被打开两次的方式。

4

1 回答 1

0

只读取一次文件并将所有行添加到ArraList<String>. ArrayList自动增长中。稍后处理该 ArrayList 以拆分行。

进一步优化:Strimg.split 使用一个巨大的正则表达式分析器。尝试使用 StringTokenizer 或您自己的 stringsplit 方法。

您可以通过使用GrowingIntArray 或GrowingStringArray 来代替ArrayList 来避免开销,这些可以避免一些开销但不太方便。

速度和内存使用是矛盾的,通常你不能同时优化两者。

您可以通过使用一维数组来节省内存,在 java 中,二维数组需要更多空间,因为每一列都是一个对象。通过 X[col + row *rowsize] 访问一个 dim 数组。

于 2013-03-08T12:21:21.677 回答