vahid-p
سه شنبه 09 اردیبهشت 1393, 01:33 صبح
سلام دوستان
سوال اولم اینه که تفاوت اصلی flip و clear چیه؟ هر دوشون اشاره گر رو به خونه اول بافر میبرن درسته؟ چیزی که خودم حدس میزنم با توجه به اینکه تو stackoverflow نوشته flip بین حالت خوندن و نوشتن تعویض میکنه و با توجه به عکس هایی که گذاشتن، تفاوت در اون limit اش هست؟ یعنی clear محدوده رو کل بافر میگیره، ولی flip تا اونجایی که خونده شده؟ اگه درسته لطفا سوالات بعدی رو چک کنید :خجالت:
سوال دوم اینه چطور میتونم عملیات خوندن سرعتش رو زیادتر کنم؟
اینم کدم :
FileInputStream fileInputStream=new FileInputStream("test.dat");
FileChannel fileChannel=fileInputStream.getChannel();
ByteBuffer buffer=ByteBuffer.allocateDirect(64*1024*1024);
buffer.clear();
int byteRead=0,i;
int numChar[]=new int[256];
long size=0;
long start=System.currentTimeMillis();
while((byteRead=fileChannel.read(buffer))!=-1){
buffer.flip();
size+=byteRead;
// for(i=0;i<byteRead;i++){
//// System.out.println(buffer.get(i));
// numChar++;
// }
buffer.clear();
}
long end=System.currentTimeMillis();
System.out.println("Time = "+(end-start));
System.out.println("Size = "+size);
قسمت // خورده قسمت بعدی سوالم هست. اما در مورد این کد آیا میتونم سریعترش کنم؟ بعضی وقتها تست میکنم برای فایل 1.5 گیگی، بدک نیست، ولی اکثرا 24 ثانیه طول میکشه. ولی کدی شبیه به همین رو برای همین فایل با c++ میزنم، در حد 2 الی 3 ثانیه میخونه. از اونجایی که java.nio باید سرعتش خیلی بیشتر از java.io باشه، اما اینجا تفاوت زیادی حاصل نمیشه.
در لینک روبرو ببینید چی گفته : http://www.idryman.org/blog/2013/09/28/java-fast-io-using-java-nio-api/
گفته : the java.nio API I sped the process from 194.054 seconds to 0.16 sec!
اینو برای یه فایل 355 MB ای گفته. پس برای 1.5 گیگ هم انتظاری حدود دو سه ثانیه داریم حداقل!
[B]سوال سوم در مورد اینه که چرا از نوع byte وقتی باینری میخونیم اعداد منفی هم بهمون میده و من اومدم بعلاوه 128 کردم که نتایج بازم اشتباهه. چون تو رنج 65 تا 117 که کاراکترهای الفبا هستند، یا تعداد کاراکتر ها صفرن، یا هم خیلی کمن. و از طرفی اگر بعلاوه 128 نکنم، رنج معادل عددی کاراکتر های حرفی درست میشه! به تناقض خوردم. اگر کد اسکی A 65 هست، پس باید اعداد اسکی بین 0 تا 255 باشه و بایت هایی که از فایل میخونیم هم تو این رنج باشه و عدد منفی نداشته باشیم! ولی متاسفانه داریم و اگر منفی ها رو حساب نکنیم، اونوقت سایز فایل و تعداد کاراکتر ها برابر نمیشن! همین مشکل با c++ نوشتم هم وجود داره. مگر یک بایت غیر از 0 تا 255 چی میتونه باشه؟!
سوال اولم اینه که تفاوت اصلی flip و clear چیه؟ هر دوشون اشاره گر رو به خونه اول بافر میبرن درسته؟ چیزی که خودم حدس میزنم با توجه به اینکه تو stackoverflow نوشته flip بین حالت خوندن و نوشتن تعویض میکنه و با توجه به عکس هایی که گذاشتن، تفاوت در اون limit اش هست؟ یعنی clear محدوده رو کل بافر میگیره، ولی flip تا اونجایی که خونده شده؟ اگه درسته لطفا سوالات بعدی رو چک کنید :خجالت:
سوال دوم اینه چطور میتونم عملیات خوندن سرعتش رو زیادتر کنم؟
اینم کدم :
FileInputStream fileInputStream=new FileInputStream("test.dat");
FileChannel fileChannel=fileInputStream.getChannel();
ByteBuffer buffer=ByteBuffer.allocateDirect(64*1024*1024);
buffer.clear();
int byteRead=0,i;
int numChar[]=new int[256];
long size=0;
long start=System.currentTimeMillis();
while((byteRead=fileChannel.read(buffer))!=-1){
buffer.flip();
size+=byteRead;
// for(i=0;i<byteRead;i++){
//// System.out.println(buffer.get(i));
// numChar++;
// }
buffer.clear();
}
long end=System.currentTimeMillis();
System.out.println("Time = "+(end-start));
System.out.println("Size = "+size);
قسمت // خورده قسمت بعدی سوالم هست. اما در مورد این کد آیا میتونم سریعترش کنم؟ بعضی وقتها تست میکنم برای فایل 1.5 گیگی، بدک نیست، ولی اکثرا 24 ثانیه طول میکشه. ولی کدی شبیه به همین رو برای همین فایل با c++ میزنم، در حد 2 الی 3 ثانیه میخونه. از اونجایی که java.nio باید سرعتش خیلی بیشتر از java.io باشه، اما اینجا تفاوت زیادی حاصل نمیشه.
در لینک روبرو ببینید چی گفته : http://www.idryman.org/blog/2013/09/28/java-fast-io-using-java-nio-api/
گفته : the java.nio API I sped the process from 194.054 seconds to 0.16 sec!
اینو برای یه فایل 355 MB ای گفته. پس برای 1.5 گیگ هم انتظاری حدود دو سه ثانیه داریم حداقل!
[B]سوال سوم در مورد اینه که چرا از نوع byte وقتی باینری میخونیم اعداد منفی هم بهمون میده و من اومدم بعلاوه 128 کردم که نتایج بازم اشتباهه. چون تو رنج 65 تا 117 که کاراکترهای الفبا هستند، یا تعداد کاراکتر ها صفرن، یا هم خیلی کمن. و از طرفی اگر بعلاوه 128 نکنم، رنج معادل عددی کاراکتر های حرفی درست میشه! به تناقض خوردم. اگر کد اسکی A 65 هست، پس باید اعداد اسکی بین 0 تا 255 باشه و بایت هایی که از فایل میخونیم هم تو این رنج باشه و عدد منفی نداشته باشیم! ولی متاسفانه داریم و اگر منفی ها رو حساب نکنیم، اونوقت سایز فایل و تعداد کاراکتر ها برابر نمیشن! همین مشکل با c++ نوشتم هم وجود داره. مگر یک بایت غیر از 0 تا 255 چی میتونه باشه؟!