Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mendapatkan Kembali 10 Baris Terakhir daripada Fail Teks yang Sangat Besar?

Bagaimanakah Saya Boleh Mendapatkan Kembali 10 Baris Terakhir daripada Fail Teks yang Sangat Besar?

Barbara Streisand
Lepaskan: 2024-12-29 10:20:11
asal
239 orang telah melayarinya

How Can I Efficiently Retrieve the Last 10 Lines from a Very Large Text File?

Pendapatan Cekap 10 Baris Terakhir daripada Fail Teks Besar

Menentukan pendekatan paling cekap untuk mengekstrak 10 baris terakhir daripada teks yang sangat besar fail (melebihi 10GB) memerlukan strategi yang meminimumkan pengiraan overhead.

Menggunakan Kedudukan Fail dan Reverse Seek

Pendekatan yang disyorkan ialah menavigasi ke hujung fail menggunakan kaedah Seek() dan bergerak ke belakang secara beransur-ansur dalam fail sehingga menemui 10 baris baharu. Dengan mengekalkan kiraan baris, kaedah mengenal pasti titik permulaan yang tepat untuk membaca ke hadapan dan mendapatkan semula baris yang dikehendaki. Strategi ini cekap mengendalikan fail dengan bilangan baris yang berbeza-beza, termasuk yang mempunyai kurang daripada 10.

Contoh Pelaksanaan dalam C#

Kod C# berikut menunjukkan pelaksanaan pendekatan yang disebutkan di atas, digeneralisasikan untuk mencari nomborOfToken terakhir dalam fail yang dikodkan dengan pengekodan dan dipisahkan oleh tokenSeparator:

public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) {
    int sizeOfChar = encoding.GetByteCount("\n");
    byte[] buffer = encoding.GetBytes(tokenSeparator);
    
    using (FileStream fs = new FileStream(path, FileMode.Open)) {
        Int64 tokenCount = 0;
        Int64 endPosition = fs.Length / sizeOfChar;

        for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) {
            fs.Seek(-position, SeekOrigin.End);
            fs.Read(buffer, 0, buffer.Length);

            if (encoding.GetString(buffer) == tokenSeparator) {
                tokenCount++;
                if (tokenCount == numberOfTokens) {
                    byte[] returnBuffer = new byte[fs.Length - fs.Position];
                    fs.Read(returnBuffer, 0, returnBuffer.Length);
                    return encoding.GetString(returnBuffer);
                }
            }
        }

        // handle case where number of tokens in file is less than numberOfTokens
        fs.Seek(0, SeekOrigin.Begin);
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        return encoding.GetString(buffer);
    }
}
Salin selepas log masuk

Dengan menggunakan teknik ini, pengambilan semula 10 baris terakhir daripada fail teks yang besar dicapai dengan penggunaan memori yang minimum dan kerumitan pengiraan, menyediakan penyelesaian yang cekap untuk senario pemprosesan fail biasa ini.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Kembali 10 Baris Terakhir daripada Fail Teks yang Sangat Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan