استخدام ذاكرة وقت التشغيل Haskell (GHC) أو ماذا أفعل خطأ
-
28-09-2019 - |
سؤال
لقد كتبت برنامجًا صغيرًا ، نوعًا من خادم HTTP المتخصص في Haskell ، وهو ليس أكثر تعقيدًا من الكود أدناه. ما يعززني هو استهلاك الذاكرة. على سبيل المثال ، عندما أقوم بإجراء اختبار تم تجميعه من الرمز المرفق وأقدم العديد من الطلبات المنشورة التي تحتوي على ما يصل إلى 20 ميغابايت ، فإن البرنامج بأكمله سيبلغ حجمه حوالي 800 ميجابايت وهذا يبدو غريبًا. ولا يتم إرجاع هذه المساحة إلى النظام إذا تركت مثيلًا لهذا البرنامج الذي يعمل على الخمول.
ماذا يعني هذا؟
import System.IO
import Network.HTTP.Server
import Network.Socket
import Network.URL
handler :: SockAddr -> URL -> Request String -> IO (Response String)
handler sa url rq = do
writeFile "/tmp/out" (rqBody rq)
return $ insertHeader HdrContentLength "0" (respond OK :: Response String)
main = serverWith defaultConfig {srvPort = 2121} handler
المحلول
أولاً ، أنت تستخدم String
. هذا تمثيل غير فعال للكثير من البيانات ؛ التكلفة هي ما يشبه 20 بايت لكل شخصية. يجب أن تستخدم ByteString
(في ال Data.ByteString
/ Data.ByteString.Char8
وحدات في الحزمة bytestring
) في حين أن.
ثانياً ، لا تصل GHC إلى الإصدار 6.12 وتشمله الذاكرة إلى نظام التشغيل. ومع ذلك ، فإن GHC 7.0 القادم سيفعل ذلك ، لذا حاول مع آخر مرشح الإصدار.