معالجة الملفات الضخمة بكفاءة أمر بالغ الأهمية للعديد من تطبيقات Go. قراءة الملف سطراً سطراً، بدلاً من تحميل الملف بأكمله في الذاكرة، هي استراتيجية تحسين رئيسية. تشرح هذه المقالة كيفية تحقيق ذلك بكفاءة باستخدام مكتبة Go القياسية، مع التركيز على أفضل الممارسات ومعالجة الأخطاء.
محتويات
- استيراد الحزم
- القراءة سطراً سطراً باستخدام
bufio.Scanner
- مثال كامل
- ضبط حجم مخزن
Scanner
- معالجة الأخطاء المتينة
استيراد الحزم
سنستخدم بشكل أساسي حزمة bufio
لإدخال/إخراج مُخزّن، مما يحسّن الأداء بشكل كبير مقارنة بالقراءة البايتية الخام. تعالج حزمة os
عمليات الملفات.
import (
"bufio"
"fmt"
"os"
)
القراءة سطراً سطراً باستخدام bufio.Scanner
bufio.Scanner
هو الأداة المثالية. يقرأ البيانات على شكل أجزاء، ويخزنها مؤقتاً لتحقيق الكفاءة. تسترد طريقتها Scan()
السطر التالي، وتعيد true
عند النجاح و false
في نهاية الملف.
func processFileLineByLine(filePath string) {
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("خطأ في فتح الملف '%s': %vn", filePath, err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
// معالجة كل سطر (مثل: fmt.Println(line))
}
if err := scanner.Err(); err != nil {
fmt.Printf("خطأ في قراءة الملف '%s': %vn", filePath, err)
}
}
مثال كامل
يُظهر هذا المثال قراءة ومعالجة الأسطر من ملف اسمه my_file.txt
. تذكر إنشاء هذا الملف في نفس الدليل.
package main
import (
"bufio"
"fmt"
"os"
)
// ... (دالة processFileLineByLine من الأعلى) ...
func main() {
filePath := "my_file.txt"
processFileLineByLine(filePath)
}
ضبط حجم مخزن Scanner
بالنسبة للملفات أو الأسطر الضخمة للغاية، قم بضبط حجم مخزن bufio.Scanner
باستخدام scanner.Buffer()
. تُقلل المخازن الأكبر من عدد نداءات النظام، ولكنها تستهلك المزيد من الذاكرة. ابحث عن توازن بناءً على خصائص ملفك والموارد المتاحة.
scanner := bufio.NewScanner(file)
bufferSize := 1024 * 1024 // مخزن 1 ميجابايت
scanner.Buffer(make([]byte, bufferSize), bufferSize)
معالجة الأخطاء المتينة
تحقق دائمًا من وجود أخطاء بعد فتح الملف وبعد المسح الضوئي. يضمن بيان defer file.Close()
إغلاق الملف حتى في حالة حدوث أخطاء. تساعد رسائل الخطأ الواضحة في تصحيح الأخطاء.