PDA

View Full Version : مشکل در پردازش فایلهای تکست خیلی بزرگ



gioteen
سه شنبه 08 بهمن 1392, 13:04 عصر
سلام دوستان من کد زیر رو نوشتم که وقتی فایلهای ورودی خیلی سنگین میشن نمیشه ازش استفاده کرد.
من کدی که نوشتم و فایلهای ورودی رو قرار میدم لطفا راهنمایی کنید.








/*
* To change this license header, choose License Headers in

Project Properties.
* To change this template file, choose Tools |

Templates
* and open the template in the editor.
*/






package javaapplication2;






import java.io.BufferedReader;
import java.io.BufferedWriter;
import

java.io.FileReader;
import java.io.FileWriter;
import

java.io.IOException;
import java.util.Scanner;






/**
*
* @author J2ee
*/
public class

JavaApplication2 {






/**
* @param args the command

line arguments
*/
public

static void main(String[] args) {





BufferedReader br2=null;
try

{

String

cr2;

br2 =
new BufferedReader(new

FileReader("1.txt"));











BufferedWriter writer = new BufferedWriter(new FileWriter("out.txt"));








while((cr2=br2.readLine())!=null)


{ Scanner in2 = new

Scanner(cr2);


try

{





int

a=-1;


try

{


a= Integer.parseInt(in2.next());




} catch (Exception e)

{


System.out.println("error in

input!!!");


}





BufferedReader

br=null;


int b=0;
try

{

String

cr;
br
=
new BufferedReader(new

FileReader("2.txt"));





while((cr=br.readLine())!=null &&

b!=-1)

{
Scanner in = new

Scanner(cr);


try

{


if( Integer.parseInt(in.next())<=a &&

a<=Integer.parseInt(in.next()))


b+=1;





} catch (Exception e)

{


e.printStackTrace();


}








}


writer.write

(Integer.toString(b).concat("\n"));


//System.out.println(b);
}
catch
(IOException e)

{


e.printStackTrace();


}finally{


try

{


if(br!=null)br.close();


} catch (IOException ex)

{


ex.printStackTrace();


}


}





} catch (Exception e)

{


e.printStackTrace();


}








}


writer.close();
} catch

(IOException e)

{


e.printStackTrace();


}finally{


try

{


if(br2!=null)br2.close();








//Close

writer







} catch

(IOException ex)

{


ex.printStackTrace();


}


}













}

}





در فایل یک هر سطر یک اینتجر قرار دارد. این فایل میتواند شامل یک میلیارد سطر باشد.
در فایل دو هر سطر دو اینتجر قرار دارد که یک فاصله بین آنها وجود دارد.

هدف پیدا کردن سریعترین راه برای حل مسئله هست ممنون میشم اگر راهنمایی کنید.

cups_of_java
سه شنبه 08 بهمن 1392, 16:26 عصر
ٔدنبال چطور پردازشی هستی؟ یه سری از کار ها رو میشه با Batch Scriptها مخصوصن توی لینوکس نوشت. بدون نیاز به نوشتن جاوا!

gioteen
سه شنبه 08 بهمن 1392, 16:51 عصر
ٔدنبال چطور پردازشی هستی؟ یه سری از کار ها رو میشه با Batch Scriptها مخصوصن توی لینوکس نوشت. بدون نیاز به نوشتن جاوا!

پردازش خاصی نیست همون طور که تو کد میبینید ما در فایل 1 یکسری عدد داریم و در فایل 2 یکسری بازه . هدف پیدا کردن تعداد بازه هایی هست که اون عدد رو شامل میشند. واسه هر عدد باید کل بازه ها رو چک کنیم. از آنجا که تعداد عددها در فایل یک به یک میلیارد هم میرسد کد بالا بسیار کند است . این یک پروژه هست که حتما باید با جاوا انجام شود.

cups_of_java
سه شنبه 08 بهمن 1392, 20:11 عصر
شما هر فایل رو فقط یکبار میخونی و اعداد رو توی یک ساختار داده مشخص نگه میداری که مرتب شده داشته باشن. اگر حوصله داشته باشی و یه درخت بازه ازشون بسازی که خیلی کارت راحت تر شاید بشه.
بعد هر بازه رو بررسی می کنی توی اون ساختار و تمام اعدادی که توی بازه باشن (نود های درخت)‌ درمیان!
جزییات الگوریتم توی ساختار داده هایی که میشه استفاده کرد تاثیر میزاره و نهایتن این تو زمان اجرا میتونی خیلی مفید باشه.

واسه جزییات استفاده از متدهای سریع تر اینا رو بخون
http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly

http://stackoverflow.com/questions/13155700/fastest-way-to-read-and-write-large-files-line-by-line-in-java

http://stackoverflow.com/questions/5854859/faster-way-to-read-file