【问题标题】:Load many data to a Jtable efficient将许多数据加载到有效的 Jtable
【发布时间】:2013-09-18 13:22:05
【问题描述】:

我有一个文件,我从中读取数据并将它们放入jTable。问题是当文件有很多数据(例如 300.000 行)时,我的应用程序需要大量内存(350MB)。有什么有效的方法可以在JTable 中加载许多行吗?

我创建了一个Default Model 和一个类似的 Jtable:

DefaultTableModel model = new DefaultTableModel(array, colNames);
JTable data_table = new JTable();
data_table.setModel(model);

数组“array”包含数据,数组“colNames”包含列的名称。

【问题讨论】:

  • 如果您将这么大的文件加载到表中,可能不可避免地会消耗大量内存。是否有必要一次将所有数据保存在内存中?如何从文件中加载数据?
  • 我想搜索 JTable 中的记录。如果数据不在内存中,我该怎么做?
  • 您可以使用一些替代方法,但访问该数据的最快方法是通过易失性内存。您的应用程序倾向于更大的内存占用可能是不可避免的。你是如何从文件中加载数据的?
  • 我打开读取第一行的文件,将其拆分并将其存储在二维数组'array'中
  • 例如 300.000 行超出/超载人类的可能性,加载可能需要 2-3 分钟以上,排序/过滤是关于如何度过空闲时间,使用分页逻辑 ....

标签: java performance swing file-io jtable


【解决方案1】:

使用嵌入式数据库,仅在模型中存储记录 ID,然后仅在需要过滤/排序行时存储。

【讨论】:

    【解决方案2】:

    如果没有足够的信息来提供特定的解决方案,您也许能够为数据的主键确定一个合理的分区函数,例如String 前缀或 Date 范围。使用相邻控件根据选择更新TableModel。在这个example 中,按钮用于更改图表的数据模型。要尽量减少延迟,请使用SwingWorker。除了内存问题,您可能希望filter 表或将文件加载到内存数据库中,例如H2 Database

    【讨论】:

    • 我喜欢为主键识别函数的想法。如果密钥已编码信息。人们可以在没有实际数据的情况下进行简单的操作,并且仅在需要时才加载。
    【解决方案3】:

    如果你想减少程序的内存消耗。 您可以使用java.nio.channels.FileChannel 并将文件的一部分映射到您的主内存。

    但您必须重新加载/更改当前映射,具体取决于您的视图。
    看一下map方法的javadoc。


    我不知道您的文件到底是什么,但如果您只是将它用作实际数据库的简单替代品。你最好用一个真正的。

    【讨论】:

      猜你喜欢
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多