Cái glob
đầu tiên tạo ra tất cả các mở rộng tên tệp có thể, vì vậy trước tiên nó sẽ tạo danh sách đầy đủ từ kiểu toàn cầu / kiểu vỏ mà nó được đưa ra. Chỉ sau đó nó sẽ lặp đi lặp lại trên nó, nếu được sử dụng trong bối cảnh vô hướng. Đó là lý do tại sao rất khó (không thể?) Để thoát khỏi trình vòng lặp mà không làm cạn kiệt nó; thấy bài này .
Trong ví dụ đầu tiên của bạn đó là 26 5 chuỗi ( 11_881_376
), mỗi chuỗi dài 5 ký tự. Vì vậy, một danh sách ~ 12 triệu chuỗi, với tổng số (ngây thơ) vượt quá 56Mb ... cộng với chi phí cho một vô hướng, mà tôi nghĩ tối thiểu là 12 byte hoặc hơn thế. Vì vậy, theo thứ tự của 100Mb, ít nhất, ngay trong một danh sách. †
Tôi không nhận thức được bất kỳ giới hạn chính thức nào về độ dài của mọi thứ trong Perl (ngoài regex) nhưng glob
liệu tất cả những gì bên trong và phải có giới hạn không có giấy tờ - có lẽ một số bộ đệm bị tràn ngập ở đâu đó, trong nội bộ? Nó là một chút quá mức.
Đối với cách này - tạo ra danh sách các chuỗi 5 ký tự lặp đi lặp lại, thay vì để phép glob
thuật của nó đằng sau hậu trường. Sau đó, nó hoàn toàn không có vấn đề.
Tuy nhiên, tôi thấy toàn bộ điều này hơi lớn cho sự thoải mái, ngay cả trong trường hợp đó. Tôi thực sự khuyên bạn nên viết một thuật toán tạo và cung cấp một phần tử danh sách tại một thời điểm (một "trình vòng lặp") và làm việc với nó.
Có những thư viện tốt có thể làm điều đó (và nhiều hơn nữa), một số trong đó là Thuật toán :: Vòng lặp được đề xuất trong bài đăng trước về vấn đề này (và trong một nhận xét), Thuật toán :: Kết hợp (cùng nhận xét), Set::CrossProduct
từ một câu trả lời khác đây ...
Cũng lưu ý rằng, trong khi đây là một cách sử dụng thông minh glob
, thư viện có nghĩa là để làm việc với các tệp. Ngoài việc sử dụng sai về nguyên tắc, tôi nghĩ rằng nó sẽ kiểm tra từng tên (~ 12 triệu) cho một mục hợp lệ ! (Xem trang này .) Đó là rất nhiều công việc đĩa không cần thiết. (Và nếu bạn sử dụng "globs" như *
hoặc ?
trên một số hệ thống, nó sẽ trả về một danh sách chỉ có các chuỗi thực sự có tệp, vì vậy bạn sẽ lặng lẽ nhận được các kết quả khác nhau.)
† Tôi nhận được 56 byte cho một kích thước của một đại lượng vô hướng 5 char. Mặc dù đó là một biến được khai báo, có thể mất nhiều hơn một chút vô hướng, nhưng trong chương trình thử nghiệm có 4 chuỗi dài, tổng kích thước thực tế thực sự là một thứ tự lớn hơn lớn hơn so với biến được tính toán một cách ngây thơ. Vì vậy, thực tế có thể là theo thứ tự 1Gb, trong một hoạt động.
Cập nhật Một chương trình thử nghiệm đơn giản tạo ra danh sách các chuỗi dài 5 ký tự (sử dụng cùng một glob
cách tiếp cận) đã chạy trong 15 phút trên máy lớp và chiếm 725 Mb bộ nhớ.
Nó đã tạo ra đúng số chuỗi dài 5 ký tự thực tế, dường như chính xác, trên máy chủ này.