2013-06-11 5 views
2

Моя программа читает текстовые файлы различных размеров. Затем он берет числа из текстового файла и создает списки массивов на основе чисел. Самый большой файл, который я планирую использовать, составляет 286 040 КБ. Когда я запускаю свою программу и читает файл, моя программа перестает работать.Размер файла слишком большой для java

Как узнать, какой размер максимальная моя программа java может обрабатывать? Есть ли способ вычислить, как большой размер файла, который может обрабатывать моя java-программа?

Кроме того, какие наилучшие предложения для того, чтобы моя программа могла удерживать списки массивов такого большого размера? Однако я слышал о хэш-таблицах; Я не смог полностью понять концепцию.

За запрос, я добавляю, как я загрузить файл:

String name = getFileName(); 
Scanner scanDaily = new Scanner(new File(name)); 

public static String getFileName() 
{ //getFileName 
    Scanner getName = new Scanner (System.in); 
    System.out.println("Please input File Name"); 
    String fileName = getName.nextLine(); 
    return fileName;  
} //getFileName 

Обновление: Спасибо тем, кто откликнулся, его очень полезным

Новая проблема

теперь я хочу для чтения номеров из файла в аррайолог

  String name = getFileName(); 
    FileReader f= new FileReader(new File(name)); 
     BufferedReader bf=new BufferedReader(f); 
     Scanner sc=new Scanner(bf); 

    ArrayList<Double> ID = new ArrayList<Double>(); 
    ArrayList<Double> Contract = new ArrayList<Double>(); 
    ArrayList<Double> Date = new ArrayList<Double>(); 
    ArrayList<Double> Open = new ArrayList<Double>(); 
    ArrayList<Double> High = new ArrayList<Double>(); 
    ArrayList<Double> Low = new ArrayList<Double>(); 
    ArrayList<Double> Close = new ArrayList<Double>(); 
    ArrayList<Double> Volume = new ArrayList<Double>(); 

    int rows = 8; 
    int counter1 = 0; 

    //Update code to prompt user for file 
    ArrayList<Double> list = new ArrayList<Double>(); 

    while (scanDaily.hasNext()) 
    { //while 
     double value = scanDaily.nextDouble(); 
     DecimalFormat df = new DecimalFormat("#.#####"); 
     df.format(value); 
     list.add(value); 
    } //while 

прежде чем использовать как canner, чтобы прочитать мой файл, и этот сканер был назван scandaily. Теперь, когда у меня есть filereader и буферизованный читатель, который я использую для прохождения через txt-файл?

+1

Вы должны адаптировать свою программу, чтобы выполнять действия, когда вы читаете файл, а не загружаете весь файл, прежде чем что-то делать. –

ответ

1

Когда я запускаю свою программу и читает файл, моя программа останавливается .

Я думал, что проблема будет такой и подтверждена после того, как вы добавите код. Раньше я сталкивался с подобной проблемой.

Использование Scanner непосредственно связано с проблемой File. Потому что это не буферизировано. Вместо этого используйте BufferedReader. Использование сканера с большим файловым объектом напрямую оказалось неудачным. Потому что это не буферизуемое, я думаю.

Scanner scanDaily = new Scanner(new File(name)); //problematic for big files. 

Использование BufferedReader с помощью FileReader вместо этого. Он буферизирует данные из файла по мере необходимости, но не сразу.

Пример:

 import java.io.BufferedReader; 
    import java.io.FileReader; 
    import java.util.Scanner; 
    import java.io.File; 
    ............... 
    FileReader f=new FileReader(new File(fileName)); 
    BufferedReader bf=new BufferedReader(f); 
    Scanner sc=new Scanner(bf); 

Так что ваш код теперь становится:

 String name = getFileName(); 
    FileReader f= new FileReader(new File(name)); 
    BufferedReader bf=new BufferedReader(f); 
    Scanner sc=new Scanner(bf); 

Ваша программа зависает с кодом сканера, так как он загружается ваш большой файл сразу в памяти и, следовательно, принимая время ,

Кроме того, какие наилучшие предложения для того, чтобы моя программа могла провести массивные списки такого большого размера? Я слышал о хэш-таблицах, ; Я не смог полностью понять концепцию.

В этом случае, размер файла большой. Я бы предложил вам использовать файл с отображением памяти. Итак, вы можете сопоставить файл в памяти и использовать его для доступа к нему, как массив. See this link about memory mapping in java.

Возможно, вы уже знаете о ArrayLists.

Я проинформирую о HashMap: HashMap использует пару ключей значения для хранения данных, у вас есть ключ, на основании которой хранится значение. Вы будете использовать ключ для хранения данных и получения данных.

Пример:

  HashMap<KeyType,ValueType> hm=new HashMap<KeyType,ValueType> 

Так Таким образом, вы можете использовать любой тип, ключ и любого типа в качестве значения.

  HashMap<Integer,String> hm = new HashMap<Integer,String> 
      hm.set(0,"hello"); 
      hm.set(5,"bello"); 

      HashMap<String,String> sm=new HashMap<String,String> 
      sm.set("USA","United States of America"); 
      sm.set("UK","United Kingdom"); 
      sm.set("IND","India"); 
      sm.set("AUS","Australia");    

      so, you can query `sm.get("AUS")` to get `"Australia"`, 

Чтобы определить, какие структуры данных использовать: When to use HashMap over LinkedList or ArrayList and vice-versa

Я надеюсь, что это решит проблему.

+0

скажите, если это разрешило проблему. – pinkpanther

+0

Извините за последнее время ответ. Проблема с вашим кодом заключается в том, что вы не можете конвертировать из архиватора в сканер (или, как говорит eclipse). – Danny

+0

Тип Несоответствие, не может конвертировать из Сканера в FileReader – Danny

2

Вы можете increase the max memory size of the JVM через что-то вроде:

$ java -Xmx1024m .... 

, но вы можете быть более эффективным в том, как читать и хранить эти данные. например читаете ли вы полный файл в памяти и затем синтаксический анализ/преобразование в список ints? Если да, почему бы просто не читать и не анализировать каждую строку, не сохраняя полный файл в памяти.

например. см. this answer для получения дополнительной информации.

+0

Что значит? Это звучит как хорошая идея, hoewver; Я не понимаю, как его реализовать – Danny

+0

@ user2474459 Какой метод вы используете для загрузки файла? можете ли вы добавить эту часть кода к своему вопросу? это важно .... – pinkpanther

+0

Я обновил свой вопрос, чтобы показать, как я загружаю файл – Danny

0

Поскольку максимальный размер файла, который вы используете в < 3 Гб, и я предполагаю, что вы работаете его на машине, где оперативной памяти> 3 Гб, вы можете запустить программу, используя следующий аргумент

java -Xmx3046m -jar yourjarname.jar 
+0

вы можете объяснить чуть подробнее, что вы имеете в виду. Я тоже сохраняю свой java-файл как .jar? Я немного смущен – Danny

+0

Я имел в виду, если вы сделали банку из своего java-кода. Как вы используете свой Java-код. Из IDE ?? – abhinav

+0

Я использую eclipse прямо сейчас, но собираюсь запустить его в CMD, когда я проверил этот метод. – Danny

0

Вы можете попытаться увеличить выделение памяти для JVM. Check this post. Также попытайтесь отследить точное исключение/ошибку, которую вы получите, если ваша программа зависает, прежде чем делать выводы.

6

Вам действительно нужно иметь весь файл в памяти?

Для простого лечения, следует рассмотреть возможность использования BufferedReader, особенно BufferedReader.readLine

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

0

Если вы храните эти цифры как int, вы можете записать числа в файл с отображением памяти (java.nio) Int Buffer. Зависит от сценария использования.

Возможно, будет осуществлен фиксированный негабаритный int[].

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