Yang glob
pertama menciptakan semua kemungkinan ekspansi nama file, jadi itu akan menghasilkan daftar lengkap dari glob-style shell-pola yang diberikan. Hanya kemudian akan beralih di atasnya, jika digunakan dalam konteks skalar. Itu sebabnya sangat sulit (mustahil?) Untuk melarikan diri dari iterator tanpa melelahkannya; lihat posting ini .
Dalam contoh pertama Anda yaitu 26 5 string ( 11_881_376
), masing-masing panjang lima karakter. Jadi daftar ~ 12 juta string, dengan (naif) total lebih dari 56Mb ... ditambah overhead untuk skalar, yang saya pikir minimal 12 byte atau lebih. Jadi pada urutan 100MB, paling tidak, di sana dalam satu daftar. †
Saya tidak mengetahui adanya batasan formal pada panjang hal di Perl (selain di regex) tetapi glob
apakah semua itu secara internal dan harus ada batas tidak berdokumen - mungkin beberapa buffer dikuasai di suatu tempat, secara internal? Itu agak berlebihan.
Adapun cara untuk mengatasi ini - buat daftar string 5-char iteratif, daripada membiarkan glob
roll sihirnya di belakang layar. Maka itu sama sekali tidak seharusnya memiliki masalah.
Namun, saya menemukan semuanya agak besar untuk kenyamanan, bahkan dalam kasus itu. Saya benar-benar merekomendasikan untuk menulis algoritma yang menghasilkan dan menyediakan elemen daftar satu per satu ("iterator"), dan bekerja dengannya.
Ada perpustakaan yang baik yang dapat melakukan itu (dan banyak lagi), beberapa di antaranya adalah Algoritma :: Loop direkomendasikan dalam posting sebelumnya tentang masalah ini (dan dalam komentar), Algoritma :: Combinatorics (komentar yang sama), Set::CrossProduct
dari jawaban lain disini ...
Juga perhatikan bahwa, meskipun ini adalah penggunaan yang cerdas glob
, perpustakaan dimaksudkan untuk bekerja dengan file. Terlepas dari menyalahgunakannya secara prinsip, saya pikir itu akan memeriksa setiap (12 juta) nama untuk entri yang benar ! (Lihat halaman ini .) Itu banyak pekerjaan disk yang tidak dibutuhkan. (Dan jika Anda menggunakan "gumpalan" seperti *
atau ?
pada beberapa sistem, ia mengembalikan daftar dengan hanya string yang benar-benar memiliki file, sehingga Anda akan diam-diam mendapatkan hasil yang berbeda.)
† Saya mendapatkan 56 byte untuk ukuran skalar 5-char. Sementara itu untuk variabel yang dideklarasikan, yang mungkin memerlukan sedikit lebih banyak daripada skalar anonim, dalam program uji dengan panjang-4 string ukuran total sebenarnya memang urutan besarnya lebih besar daripada yang dihitung secara naif. Jadi yang asli mungkin berada di urutan 1Gb, dalam satu operasi.
Pembaruan Sebuah program uji sederhana yang menghasilkan daftar string 5-char panjang (menggunakan glob
pendekatan yang sama ) berjalan selama 15-ish menit pada mesin kelas server dan mengambil memori 725 Mb.
Itu memang menghasilkan jumlah yang tepat dari string panjang 5-char yang sebenarnya, tampaknya benar, di server ini.