使用Properties类加载地图

时间:2015-08-26 12:01:46

标签: java optimization properties hashmap

我有一个包含75000个条目的地图,每个条目的平均值大小为10kb。

我使用Properties类将此映射加载到内存中。但是由于地图的大小,当主机上的RAM很小时,我得到OutOfMemoryException。

我有一个选项是批量读取条目(如10,000)到内存而不是加载完整的地图。 处理完第一个10k后,读取下一个10k。

有没有办法使用Properties类完成此操作。

此外,有没有更好的方法以这种方式加载地图条目?

谢谢和问候,
Sujith

2 个答案:

答案 0 :(得分:2)

不要使用Properties,这是遗产

  1. 将条目分为多个文件

  2. 按顺序阅读每个文件,使用Preferences

  3. 加载和处理

    示例代码:

    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我不知道。