استخدام ذاكرة وقت التشغيل Haskell (GHC) أو ماذا أفعل خطأ

StackOverflow https://stackoverflow.com/questions/4082375

  •  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 القادم سيفعل ذلك ، لذا حاول مع آخر مرشح الإصدار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top