2015-08-26 36 views
1

我有75000个条目的地图,每个条目的值平均大小为10kb。使用Properties属性加载地图class

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

我的一个选择是将批量(如10,000)的条目读入内存,而不是加载完整的映射。 处理完初始10k后读取下一个10k。

有什么办法可以使用Properties类来完成这个任务。

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

感谢和问候,
Sujith

回答

2

不要使用Properties,这是传统的

  1. 鸿沟项成多个文件

  2. 按顺序阅读,加载和处理每个文件使用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

我认为你不需要同时加载所有的属性,但你更需要通过所有属性进行迭代。 就我个人而言,我会逐行解析文件,并以流式的方式工作。 如果有一个处理非常大的属性的库我不知道。

+0

嗨, 每次获取每个条目将导致750000个文件读取操作。这会影响执行速度。有什么方法可以一次读出前n行? – sujith

+0

如果使用BufferedReader,则可以使用特定的高速缓存大小读取每行的行数,以优化文件访问的等待时间。 –