English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

الخوارزمية Prim في NetworkX (شرح عملي)

تقسيم الملفات والدمج هو احتياج شائع، مثل: عند رفع ملفات كبيرة، يمكن تقسيمها إلى قطع صغيرة، ثم نقلها إلى الخادم، ومن ثم إعادة دمجها. أيضًا، في العديد من أنظمة الملفات الموزعة عالية المستوى (مثل: GFS من Google، TFS من Taobao)، يتم تقسيم أو دمج الملفات بناءً على وحدة block.

نظرًا للأفكار الأساسية:

إذا كان هناك ملف كبير، بعد تحديد حجم التقسيم المحدد (مثل: تقسيم حسب 1M)

الخطوة 1:

أولاً، بناءً على حجم الملف الأصلي وحجم التقسيم، احسب عدد الملفات الفرعية النهائية N

الخطوة 2:

إنشاء هذه الملفات الصغيرة N على القرص

الخطوة 3:

فتح عدة threads (عدد threads = عدد ملفات التقسيم)، في كل thread، باستخدام خاصية seek في RandomAccessFile، تحديد مؤشر القراءة في بداية كل جزء من الملف الأصلي، ثم قراءة الحجم المحدد (أي: حجم القطعة)، وأخيرًا كتابة الملفات الفرعية المخصصة، بسبب معالجة متوازية من قبل threads، يتم كتابة ملفات فرعية مختلفة، مما يجعل السرعة نسبيًا مرتفعة.

التعليمات التالية تقوم بتقسيم ملف إلى عدة ملفات فرعية، كل منها حجمه 100K

package testIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Arrays;
public class subStream {
	public static void main(String[] args) {
		//أولاً قم بقراءة ملف المصدر إلى ذاكرة الوصول العشوائي 
		int eachSize=100*1024;
		File srcFile =new File("F:/test/test.txt");
		//إنشاء ملف 
		splitFile(srcFile,eachSize);
	}
	public static void splitFile(File srcFile,int eachSize){
		//تحديد ما إذا كان الملف يتوافق مع متطلبات التفريغ 
		if(srcFile.length()==0){
			throw new RuntimeException("ملف غير يتوافق مع متطلبات التفريغ");
		}
		byte[] fileContent= new byte[(int) srcFile.length()];
		try {
			//قراءة محتوى الملف إلى ذاكرة الوصول العشوائي 
			FileInputStream fis=new FileInputStream(srcFile);
			fis.read(fileContent);
			fis.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		//حساب عدد الملفات التي يجب تفريغها 
		int fileNumber;
		if(fileContent.length%eachSize==0){
			fileNumber = fileContent.length/eachSize;
		} else{
			fileNumber = fileContent.length/eachSize+1;
		}
		for (int i=0;i<fileNumber;i++){
			String fileName = srcFile.getName()+"-"+i+".txt";
			File fi = new File(srcFile.getParent(), fileName);
			//إنشاء ملف التفريغ في مسار الملف الحالي 
			byte[] eachContent;
			//جعل محتوى ملف المصدر نسخة من ملفات التفريغ 
			if(i!=fileNumber-1){
				eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1));
			} else{
				eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length);
			}
			try {
				FileOutputStream fos = new FileOutputStream(fi);
				fos.write(eachContent);
				fos.close();
				System.out.printf("إخراج ملف فرعي %s، حجمه %d، حجم كل جزء هو %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length);
			}
			catch (Exception e) {
				// TODO: معالجة الاستثناء 
				e.printStackTrace();
			}
		}
	}
}

الخلاصة

هذا هو محتوى المقال الكامل حول مثال على رمز تقسيم ملف إلى ملفات فرعية باستخدام تدفق IO في Java، آمل أن يكون مفيدًا لك. يمكن للمشتركين المثيرة للإهتمام متابعة المزيد من المواضيع ذات الصلة في هذا الموقع، وتكون موافقة على إبداء الملاحظات على نقاط الضعف، شكرًا للدعم الذي يقدمه الأصدقاء للموقع!

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، تم جمع المحتويات من قبل المستخدمين عبر الإنترنت الذين قاموا بتحميلها بشكل تلقائي، ويستخدم هذا الموقع محتوياته دون امتلاك حقوق الملكية، ولا يتم تعديل المحتويات بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') للإبلاغ، وتقديم الدليل المتعلق، وسيتم حذف المحتوى المزعوم فور التحقق منه.