LINUX.ORG.RU

Падает прога (Java)


0

0
		FileWriter fout = new FileWriter("graph_all.txt");
		String line = null;
		
		FileReader reader1 = new FileReader("graph_first.txt");
		FileReader reader2 = new FileReader("graph_second.txt");
		FileReader reader3 = new FileReader("graph_3.txt");
		FileReader reader4 = new FileReader("graph_4.txt");
		
		BufferedReader bufferedReader1 = new BufferedReader(reader1);
		BufferedReader bufferedReader2 = new BufferedReader(reader2);
		BufferedReader bufferedReader3 = new BufferedReader(reader3);
		BufferedReader bufferedReader4 = new BufferedReader(reader4);
		
		int i = 0;
		
		try{
			while ((line = bufferedReader1.readLine()) != null){
				i++;
				fout.write(line);
				line = "";
				line = bufferedReader2.readLine();
				fout.write(line);
				line = "";
				line = bufferedReader3.readLine();
				fout.write(line);
				line = "";
				line = bufferedReader4.readLine();
				fout.write(line);
				line = "";
				fout.write("\n");
				System.out.print(i+":");
			}
			
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		fout.close();
		reader1.close();
		reader2.close();
		reader3.close();
		reader4.close();
	}

Склеиваю я таким макаром 4 больших текстовых файла (каждый размером от 1 до 1,8гигабайт), потом встречается строчка оч длинная и все падает с аутофмемори, для жавы я уже расширил память до полутора гигов. Подскажите как сделать?

★★

Последнее исправление: DDR (всего исправлений: 1)

Во всех файлах одинаковое кол-во строк.

DDR ★★
() автор топика
Ответ на: комментарий от Begemoth

Кэп рулит:) А кэп не подскажет сколько можно за раз засовывать в string? И как читать ее пока не конец строки или пока не считано конкретное число метров?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Зачем вообще String использовать? Прочитал char, записал char, пока конец строки не встретился. Повторить для оставшихся трёх файлов. Вы используете Buffered-потоки, которые и так буферизуют всё, что надо, зачем делать ещё один буфер в виде строки, к тому же неконтролируемой длины.

Legioner ★★★★★
()
Ответ на: комментарий от JFreeM

Лучше спросить почему ещё никто не сказал про потребление памяти джавой и не предложил переписать на C.

Begemoth ★★★★★
()
Ответ на: комментарий от DDR

Что за строки там у тебя что падает? Делай не через FileReader-Writer, а через FileInputStream или как он там называется

Karapuz ★★★★★
()
Ответ на: комментарий от Begemoth

Лучше спросить почему ещё никто не сказал про потребление памяти джавой и не предложил переписать на C.

мне не нравится, как она пишется на си — имхо тут нужны итераторы и быстрые исключения

кто-нить сможет лучше?

#include <stdio.h>

int main(int argc, char** argv)
{
    FILE* file[argc];
    int c[argc];
    int i;
    for(i=1; i<argc; i++)
    {
        file[i]=fopen(argv[i], "rb"); /// FIXME: добавь обработку ошибок
    }
    int go=1;
    while( go )
    {
        go=0;
        for(i=1; i<argc; i++)
        {
            int ch;
            while( (ch = fgetc(file[i]) ) != EOF ) {
                go=1;
                putchar(c[i]=ch);
                if( ch=='\n')  break;
            }
            if( ch==EOF && c[i]!='\n' )   /// а вот тут мозги пришлось включить
                putchar(c[i]='\n');
        }
    }
    return 0;
}

хинт: файлы не обязаны заканчиваться \n

www_linux_org_ru ★★★★★
()

а топикстартеру я бы предложил добавить 10ГБ свопа — это проще всего, и главное надежней

как альтернатива возможна двухпроходная схема, где файлам, не заканчивающимся на \n она добавляется, а дальше тупо посимвольно; но это уж если их много надо лопатить

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Begemoth

> Тогда уж paste

paste -d"\n" a.test b.test

вставляет лишние пустые строки если файлы разные по к-ву строк (правда, это не случай топикстартера)

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

paste -d"\n" a.test b.test
оно их на разные строчки ставит, т.е. через '\n' а как сделать чтобы на одной?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Если пишу так paste a.test b.test то тогда на одной строке, но между словами из разных файлов табуляция ставиться, как ее не ставить? Или потом отдельным скриптом выдерать табы?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Где жу вы были раньше?:) 2 команды:
paste 1.txt 2.txt 3.txt 4.txt > 5.txt
sed -i 's/\t//g' 5.txt
И все:) Всем спасибо:)

DDR ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Всем огромное спасибо:) За различные идеи и решения!:)

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Если в исходных файлах были tab'ы, то скрипт выдерет и их, может лучше man paste, чтобы было «paste -d ' ' a.test b.test»?

mky ★★★★★
()

Вы Лжете. Проги На Джаве Не Падают!

anonymous
()
Ответ на: комментарий от ZeMvlad

Проблема конечно решена, но все же, оно выдает эксепшен (не падает!!!) при чтение, а не при записи.

DDR ★★
() автор топика
Ответ на: комментарий от DDR

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

ZeMvlad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.