【问题标题】:Reading large sets of data in Java在 Java 中读取大量数据
【发布时间】:2012-05-16 04:01:52
【问题描述】:

我正在使用 Java 读取和处理来自 UCI Machine Learning Repository 的一些数据集。 我开始为每个数据集创建一个类并使用特定的类文件。数据集中的每个属性都由所需类型的类中的相应数据成员表示。这种方法效果很好,直到没有。归因于

问题: 我现在必须处理很多大型数据集。具有> 20-30个属性的那些以这种方式工作非常乏味。我不需要查询。我的数据离散化算法只需要对数据进行 4 次扫描即可对其进行离散化。我的工作在离散化后立即结束。这里有什么有效的策略?

我希望我能够清楚地说明我的问题。

【问题讨论】:

  • 一些问题:1)您打算如何使用这些数据?如果你想查询或做类似的事情,可能数据库是你最好的选择。 2)如何从存储库中获取数据?
  • 大数据集是什么意思?数据到底有什么问题?你能举个例子吗?
  • 我正在测试一种新的数据离散化算法。为此,我需要读取数据并用 Java 处理它

标签: java types large-data-volumes


【解决方案1】:

一些选项:

  1. 编写代码生成器,读取文件的元数据,生成等效的类文件。
  2. 不用上课;将数据保存在 Object 或 String 的数组中,并根据需要进行转换。
  3. 为您需要的所有类型创建一个包含 DataElements 和子类 DataElements 集合的类,并使用元数据在运行时创建正确的类。

【讨论】:

  • 谢谢。这为我开辟了新的学习途径。我从来没有像你所说的代码生成器那样做过。您能否提供一些指示我可以从哪里开始学习它?
  • 在这种情况下,您只需编写一个输出 Java 类文件的程序。有很多方法可以做到这一点,但您基本上只是根据元数据打印出类骨架和成员变量,就像您手动完成一样。
【解决方案2】:

我在我的一个项目中做了类似的事情;大量可变数据,就我而言,我是从互联网上获取数据的。由于我需要查询、排序等,我花了一些时间设计一个数据库来适应数据的所有变化(并非所有条目都具有相同数量的属性)。确实需要一段时间,但最后我使用相同的代码来获取任何条目的数据(在我的例子中使用 JPA)。我的 IDE (NetBeans) 直接使用数据库模式创建了大部分代码。

从你的问题来看,不清楚你打算如何使用这些数据,所以我根据个人经验来回答。

【讨论】:

    【解决方案3】:

    创建一个包含如下成员的简单 DataSet 类:

     public class DataSet {
         private List<Column> columns = new ArrayList<Column>();
         private List<Row> rows = new ArrayList<Row>();
    
         public void parse( File file ) {
             // routines to read CSV data into this class
         }
     }
    
     public class Row {
         private Object[] data;
    
         public void parse( String row, List<Column> columns ) {
             String[] row = data.split(",");
             data = new Object[row.length];
    
             int i = 0;
             for( Column column : columns ) {
                 data[i] = column.convert(row[i]);
                 i++;
             }
         }
     }
    
     public class Column {
         private String name;
         private int index;
         private DataType type;
    
         public Object convert( String data ) {
             if( type == DataType.NUMERIC ) {
                return Double.parseDouble( data );
             } else {
                return data;
             }
         }
     }
    
     public enum DataType {
         CATEGORICAL, NUMERIC
     }
    

    这将处理您希望使用的任何数据集。唯一的问题是用户必须通过将列及其各自的数据类型定义到 DataSet 来定义数据集。您可以在代码中执行此操作,也可以从文件中读取任何您认为更容易的方法。您可能可以默认很多配置数据(例如 CATEGORICAL),或者尝试解析字段,如果失败,它必须是 CATEGORICAL 否则它的数字。通常,该文件包含一个标题,您可以解析以查找列的名称,然后您只需通过查看该列中的数据来确定数据类型。猜测数据类型的简单算法对您有很大帮助。本质上,这是每个其他包用于此类数据的完全相同的数据结构(例如 R、Weka 等)。

    【讨论】:

    • 非常感谢。这是最接近我正在考虑的实现。似乎并非 UCI Repo 中的所有文件都包含标题中的信息。我正在将我的离散数据集提供给 Weka。这是一个很大的帮助!
    • 并非 UCI Repo 中的所有数据集都有标头,但您可以为解析器提供可配置的参数。它是否具有标头实际上只是解析器查找它的参数。最后,标题只是用户可以用来引用列和配置数据集的用户友好标签。如果它在那里解析人类友好的标签。如果不是 F1、F2、F3 等,则可以使用。无论如何,您的用户必须提供诸如哪一列是预测、可能的数据类型(字符串、浮点数)等信息。
    • 谢谢。只是对上面代码的一些小修正 'public void parse(String row, List columns) { String[] cols = row.split(",");数据 = 新对象 [cols.length];诠释 i = 0; for( 列 col : columns ) { data[i] = col.convert(cols[i]);我++; } }'
    • 抱歉重命名 cols -> 行更清晰
    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多