2015-08-26 2 views
1

У меня есть карта с 75000 записей, и каждое значение записи будет в среднем иметь размер 10kb.Загрузка карты с использованием класса свойств

Загрузите эту карту в память с помощью класса свойств. Но из-за размера карты я получаю OutOfMemoryException, когда ОЗУ на хосте мало.

Один из вариантов, который у меня есть, состоит в том, чтобы читать записи в партиях (например, 10 000) в память вместо загрузки полной карты. Прочитайте следующие 10k после обработки начального 10k.

Есть ли способ выполнить это, используя класс свойств.

Кроме того, есть ли лучший способ загрузки записей карты таким образом?

Спасибо и наилучшими пожеланиями,
Суджит

ответ

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

Hi, Получение каждой записи за раз приведет к 750000 операций чтения файлов. Это повлияет на скорость выполнения. Есть ли способ, которым я мог читать первые n строк сразу. – sujith

+0

Если вы используете BufferedReader, вы можете прочитать строку в строке с определенным размером кеша, чтобы оптимизировать латентность доступа к файлам. –

Смежные вопросы