我正在将 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/