java - 加载到内存中的文件比磁盘上的文件大

标签 java memory jtable out-of-memory memory-mapped-files

我正在将 java 中的文本文件加载到内存中。文本文件的大小为 100 MB,包含数千行 String、Integer 或 Double 类型。

一旦加载到内存中,如果我使用 64 位 JDK 进行编译,它会占用整个 1 GB 或更多。

这是一个问题,因为我需要加载更大的文件。

它们以其确切的数据类型存储在数组列表中。我查看了 MemoryMappedFiles,尽管我不确定它们是否会提供我需要的功能,文本文件是用制表符分隔的 40 列,我需要在 JTable 中显示这些列,同样,我不认为我可以使用内存映射文件,如果我需要显示到 JTable 中,但也许我错了。

如有任何建议,我们将不胜感激。

数据存储如下,我需要将所有数据都存储在内存中的原因是,为了计算的目的,我在任何时候都需要访问文件中的任何行。

这是我的 JTable 表模型,请注意,传递给表模型的行数据在之后被清空,以确保内存中没有重复副本

private Object[][] data;

public TableModel(ArrayList<String> headers, RowData[] importedData)
{                
   columnNames = new String[headers.size()];
   data = new Object[importedData.length][headers.size()];

   for (int i = 0; i < headers.size(); i++) // extract the column names
    {                                        // for the table
        this.columnNames[i] = headers.get(i);
    }

   for (int i = 0; i < importedData.length; i++)  // extracting the data
   {                                              // for the table
       for (int j = 0; j < headers.size(); j++)
       {
            this.data[i][j] = importedData[i].myList.get(j);
       }
   }
}

最佳答案

我认为您在内存结构中使用了很多小对象。可能这会给你带来开销。根据我的经验,减少内存消耗的最佳方法是使用普通数组。您可以将此数组包装到其他结构中。当我使用这种方法时,它为我节省了 70% 的内存。这不是干净的代码,但如果您需要节省内存 - 它会起作用。

还从文件中逐行读取数据。读取下一行后,将此数据放入您的结构中。

例如,如果您需要两个字段 id 和名称,您可以创建如下内容:

public class DataStructure {

    private final static int SIZE_STEP = 32;

    private int size = 0;
    private int[] ids = new int[SIZE_STEP];
    private String[] names = new String[SIZE_STEP];

    public void add(int id, String name) {
        if(size >= ids.length) {
            ids = Arrays.copyOf(ids, ids.length + SIZE_STEP);
            names = Arrays.copyOf(names, names.length + SIZE_STEP);
        }
        ids[size] = id;
        names[size] = name;
        size++;
    }

    public int getId(int index) {
        return ids[index];
    }

    public String getName(int index) {
        return names[index];
    }
}

其他方法可以是分页。例如,当您仅显示 20 条记录并提供页面导航时。

关于java - 加载到内存中的文件比磁盘上的文件大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328743/

相关文章:

Java 循环仅运行最大尝试次数

java.lang.RuntimeException : Unable to resume activity Attempted to access a cursor after it has been closed

ios - APP进入后台后内存不会释放

c# - DataTable 不释放内存

java - JScrollPane 没有出现?

java - 如何使 Swing jTable 单元格在 View 和内联编辑状态下都显示 "YY-MM-DD"格式的日期对象?

Java双向链表——两个相邻节点相等

android - 用于长时间运行任务的最佳 Android 线程技术?

java - 如何在适配器类中制作JTable并在主类中调用它

Java 变量不会在 if 语句中初始化?