我有一个包含75000个条目的地图,每个条目的平均值大小为10kb。
我使用Properties类将此映射加载到内存中。但是由于地图的大小,当主机上的RAM很小时,我得到OutOfMemoryException。
我有一个选项是批量读取条目(如10,000)到内存而不是加载完整的地图。 处理完第一个10k后,读取下一个10k。
有没有办法使用Properties类完成此操作。
此外,有没有更好的方法以这种方式加载地图条目?
谢谢和问候,
Sujith
答案 0 :(得分:2)
不要使用Properties,这是遗产
将条目分为多个文件
按顺序阅读每个文件,使用Preferences
示例代码:
package com.mypack.test;
import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;
public class PreferencesExample {
public static void main(String args[]) throws FileNotFoundException {
Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
// Load file object
File fileObj = new File("d:\\data.xml");
try {
FileInputStream fis = new FileInputStream(fileObj);
ps.importPreferences(fis);
System.out.println("Prefereces:"+ps);
System.out.println("Get property1:"+ps.getInt("property1",10));
} catch (Exception err) {
err.printStackTrace();
}
}
}
示例xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="com">
<map />
<node name="mypack">
<map />
<node name="test">
<map>
<entry key="property1" value="80" />
<entry key="property2" value="Red" />
</map>
</node>
</node>
</node>
</root>
</preferences>
答案 1 :(得分:1)
我假设您不需要同时加载所有属性,但您需要遍历所有属性。 就个人而言,我会逐行手动解析文件并以类似流的方式工作。 如果有一个用于处理非常大的属性的lib我不知道。