آیا متد find_each
را میشناسید؟ اگر با Ruby on Rails کار کرده باشید حتماً از این متد استفاده کردهاید. find_each
و متد مشابه آن each
، برای گرفتن رکوردها به صورت تکتک استفاده میشوند. به عنوان مثال:
People.find_each(&:party_all_night!) People.each(&:party_all_night!)
تفاوت بین find_each
و each
در نحوهی پیادهسازی آنهاست. متد each
تمام رکوردها را در یک آرایه ذخیره میکند و یک Enumerator
برای این آرایه خروجی میدهد. حالا فرض کنید تعداد رکوردها چند میلیون باشد. تمام این چند میلیون ActiveRecord
باید در حافظه ذخیره شوند. میزان مصرف حافظه سرسامآور خواهد شد. این میتواند مشکلساز باشد، مخصوصا برای پروسسهایی که عمر طولانی دارند چون که Ruby حافظهی گرفته شده را به سیستم پس نمیدهد (و در عوض در آینده از آن دوباره استفاده میکند).