2015-11-02 6 views
0

У меня есть файл ASCII 538 МБ с 16807 строками, и каждая строка имеет 16807 0 и 1 сек, разделенных пробелом. Я хочу взять все эти значения и сохранить их в списке списков, чтобы сохранить каждую строку в новом списке.Чтение и хранение содержимого большого файла ASCII

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

ArrayList<ArrayList<String>> listOflists = new ArrayList<ArrayList<String>>(); 

    FileInputStream fstream = new FileInputStream("C:\Users...\file.txt"); 
    DataInputStream in = new DataInputStream(fstream); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

    while (true) 
    { 
     String line = br.readLine(); 
     if (line == null) { 
      break; 
     } 

     Scanner tokenize = new Scanner(line); 
     ArrayList<String> tokens = new ArrayList<String>(); 

     while (tokenize.hasNext()) 
     { 
      tokens.add(tokenize.next()); 
     } 
     listOflists.add(tokens); 
    } 
    br.close(); 

Теперь я сделал этот код, но снова выбросил мне ошибку Java heap space.

String inputFile = "C:\Users...\file.txt"; 

    LinkedList<LinkedList<Character>> charList = new LinkedList<LinkedList<Character>>(); 

    File file = new File(inputFile); 
    Reader reader = new FileReader(file); 
    char val = 0; 
    int c; 
    int iLine = 0; 

    while((c = reader.read()) != -1) { 

     val = (char)c; 
     charList.add(new LinkedList<Character>()); 

     if((c == 48) || (c == 49)){ //ascii code for 0 is 48 and for 1 is 49 
      charList.get(iLine).add(val); 
     } 
     if(c == 92){ //ascii code for "/" is 92 as to know when it changes line 
      iLine++; 
    } 
} 
reader.close(); 

Любые идеи?

+3

Увеличьте память кучи или храните его в меньшем объеме памяти. – Kayaman

+0

Я увеличиваю память кучи с этим, -Xmx1024m, но ошибка остается, и цель вопроса состоит в том, чтобы найти меньшее количество памяти, потому что я не смог найти их. – lostromos

+0

В чем смысл этого? Прочитайте файл и сохраните его в битовом поле, это значительно уменьшит использование памяти. – Marged

ответ

0

Я точно не знаю, где была ошибка в моем предыдущем коде, но вот решение, в котором я читаю файл и сохраняю позицию 1s в списке (сначала столбец, а затем строка, в которой я его нашел). Что касается большего, я также изменяю VM-вариант проекта и добавляю -Xmx1g, чтобы увеличить размер кучи. Без этого я получаю ошибку OutOfMemory (выполняю код в системе 3G RAM)

String inputFile = "C:\Users\...\file.txt"; 
    FileInputStream in = new FileInputStream(inputFile); 
    FileChannel ch = in.getChannel(); 
    ByteBuffer buf = ByteBuffer.allocate(1024); 

    ArrayList<Integer> list = new ArrayList<Integer>(); 

    int column=-1; 
    int row=0; 
    int rd; 
    while ((rd = ch.read(buf)) != -1){ 
     buf.flip(); 
     while (buf.hasRemaining()){ 
      byte byteVal = buf.get(); 

      if((byteVal == 48) || (byteVal == 49)){ //ascii code for 0 is 48 and for 1 is 49 
       column++; 
      } 
      if (byteVal == 92){ //ascii code for "/" is 92 as to know when it changes line 
        row++; 
        column=0; 
      } 
      if(byteVal == 49){ 
       list.add(column); 
       list.add(row); 

      } 
     } 
    buf.clear(); 
    } 
    ch.close(); 
0

У вас есть пустой список

LinkedList<LinkedList<Character>> charList = new LinkedList<LinkedList<Character>>(); 

и вы пытаетесь получить первый элемент

charList.get(iLine) 

из пустого списка, так что IndexOutOfBoundsException брошен.

+0

. Я просто показываю, что я опубликовал неправильный код, я редактирую свой вопрос и публикую правильную версию, которая бросает мне исключение IndexOutOfBounds, но ошибка Java heap space. Но ваш комментарий был правильным для предыдущего кода. – lostromos

+1

Увеличьте размер кучи. Например, этот параметр -Xmx1024m даст вам 1024 Мбайт пространства кучи Java. –

+0

Я сделал это, но опять та же проблема, Java кучу пространства. – lostromos

0

Вы добавляете новый LinkedList для каждой итерации цикла while с линией charList.add(new LinkedList<Character>());, даже если строка не изменяется.

+0

Да, но без этого я получаю исключение IndexOutOfBounds – lostromos

+0

Итак, вместо того, чтобы исправить эту ошибку, вы решили добавить столько «списков», что вместо получения «IndexOutOfBoundsException» у вас закончится нехватка памяти? Вам нужно только добавить список для каждой строки, и, конечно, перед циклом добавить список для первой строки. – Kayaman

+0

Я пытаюсь сохранить все значения файла в одном списке, несмотря на то, что это не то, что я хочу сделать, но пространство кучи java остается. Поэтому я думаю, что проблема не в списках. – lostromos