glob
Першим створює всі можливі розширення імен файлів, тому він буде першим генерувати повний список з оболонки стиль Глоб / шаблону це дається. Тільки тоді воно повториться, якщо його використовувати в скалярному контексті. Ось чому так важко (неможливо?) Уникнути ітератора, не виснажуючи його; дивіться цю публікацію .
У вашому першому прикладі це 26 5 рядків ( 11_881_376
), кожні п'ять символів. Отже, перелік ~ 12 мільйонів рядків із загальним (наївним) загалом перевищує 56 Мб ... плюс накладні витрати для скаляра, що, як мені здається, становить як мінімум 12 байт. Тож на замовлення 100 Мб, принаймні, саме там, в одному списку. †
Я не знаю жодних формальних обмежень щодо довжини речей у Perl (крім регексу), але glob
чи все це всередині, і повинні бути недокументовані межі - можливо, деякі буфери десь перекриті? Це трохи надмірно.
Що стосується способу цього - генеруйте цей список 5-знакових рядків ітераційно, замість того, щоб glob
пускати його магію за куліси. Тоді це абсолютно не повинно мати проблем.
Однак я вважаю, що вся справа трохи більша для комфорту, навіть у такому випадку. Я б дуже рекомендував написати алгоритм, який генерує та надає один елемент списку одночасно ("ітератор"), і працювати з цим.
Є хороші бібліотеки, які можуть це зробити (і багато іншого), деякі з яких - Алгоритм :: Петлі, рекомендовані в попередньому дописі з цього питання (і в коментарі), Алгоритм :: Комбінаторика (той же коментар), Set::CrossProduct
з іншої відповіді тут ...
Також зауважте, що, хоча це розумне використання glob
, бібліотека призначена для роботи з файлами. Крім принципового неправильного використання, я думаю, що він перевірить кожне з (12 мільйонів) імен на наявність дійсного запису ! (Див. Цю сторінку .) Це багато непотрібної роботи диска. (І якщо ви використовуєте "globs" на кшталт *
або ?
в деяких системах, він повертає список із лише рядками, у яких насправді є файли, тож ви спокійно отримаєте різні результати.)
† Я отримую 56 байт за розмір 5-ти скалярного скаляра. Хоча це для оголошеної змінної, яка може зайняти трохи більше, ніж анонімний скаляр, у тестовій програмі з довжиною-4 рядки фактичний загальний розмір дійсно є на порядок більшим, ніж наївно обчислений. Тож справжня річ цілком може бути в порядку 1 Гбіт за одну операцію.
Оновлення Проста тестова програма, яка генерує цей список 5-знакових довгих рядків (використовуючи той самийglob
підхід), працювала протягом 15 хвилин на машині серверного класу і займала 725 Мб пам'яті.
Він справді створив потрібну кількість фактичних 5-знакових довгих рядків на цьому сервері.