我有8 GB的RAM,但 Haskell程序似乎只能使用1.3 GB.

我正在使用这个简单的程序来确定GHC程序可以分配多少内存:

import System.Environment
import Data.Set as Set

main = do
         args <- getArgs
         let n = (read $args !! 0) :: Int
             s = Set.fromList [0..n]
         do
           putStrLn $"min: " ++ (show $findMin s)
           putStrLn $"max: " ++ (show $findMax s)

这是我发现的:

>运行./mem.exe 40000000 RTS -s成功并报告正在使用的总内存为1113 MB
>运行./mem.exe 42000000 RTS -s因内存不足错误而失败
>运行./mem.exe 42000000 RTS -s -M4G错误输出-M4G:大小超出允许范围
>运行./mem.exe 42000000 RTS -s -M3.9G因内存不足错误而失败

通过Windows任务管理器监视进程显示最大内存使用量约为1.2 GB.

我的系统:Win7,8 GB RAM,Haskell平台2011.04.0.0,ghc 7.0.4.

我正在编译:ghc -O2 mem.hs -rtsopts

如何使用我所有可用的RAM?我错过了一些明显的东西吗

目前,在Windows上,GHC是一个32位的GHC – 我认为当7.6到来时,应该可以使用64位GHC for windows.

这样做的一个结果是,您不能使用超过4G – 1BLOCK的内存,因为作为size参数允许的最大值是HS_WORD_MAX:

decodeSize(rts_argv[arg],2,BLOCK_SIZE,HS_WORD_MAX) / BLOCK_SIZE;

使用32位字,HS_WORD_MAX = 2 ^ 32-1.

这解释了

running ./mem.exe 42000000 +RTS -s -M4G errors out with -M4G: size outside allowed range

因为decodeSize()将4G解码为2 ^ 32.

升级GHC后,此限制也将保留,直到最终发布64位GHC for Windows.

作为32位进程,用户模式虚拟地址空间限制为2或4 GB(取决于IMAGE_FILE_LARGE_ADDRESS_AWARE标志的状态),参见Memory limits for Windows Releases.

现在,您正在尝试构建一个包含4200万个4字节Ints的Set. Data.Set.Set每个元素有五个单词开销(构造函数,大小,左右子树指针,指向元素的指针),因此Set将占用大约0.94 GiB的内存(1.008’metric’GB).但是该进程使用大约两倍或更多(它需要垃圾收集空间,至少是活动堆的大小).

在我的64位Linux上运行程序,输入21000000(以弥补两倍大的Ints和指针),我得到

$./mem +RTS -s -RTS 21000000
min: 0
max: 21000000
  31,330,814,200 bytes allocated in the heap
   4,708,535,032 bytes copied during GC
   1,157,426,280 bytes maximum residency (12 sample(s))
      13,669,312 bytes maximum slop
            2261 MB total memory in use (0 MB lost due to fragmentation)

                                    Tot time (elapsed)  Avg pause  Max pause
  Gen  0     59971 colls,0 par    2.73s    2.73s     0.0000s    0.0003s
  Gen  1        12 colls,0 par    3.31s   10.38s     0.8654s    8.8131s

  INIT    time    0.00s  (  0.00s elapsed)
  MUT     time   12.12s  ( 13.33s elapsed)
  GC      time    6.03s  ( 13.12s elapsed)
  EXIT    time    0.00s  (  0.00s elapsed)
  Total   time   18.15s  ( 26.45s elapsed)

  %GC     time      33.2%  (49.6% elapsed)

  Alloc rate    2,584,429,494 bytes per MUT second

  Productivity  66.8% of total user,45.8% of total elapsed

但是top报告只有1.1g内存使用 – 顶部,可能是任务管理器,只报告实时堆.

因此,似乎没有设置IMAGE_FILE_LARGE_ADDRESS_AWARE,您的进程仅限于2GB的地址空间,并且4200万集需要更多 – 除非您指定更小的最大或建议堆大小:

$./mem +RTS -s -M1800M -RTS 21000000
min: 0
max: 21000000
  31,200 bytes allocated in the heap
   3,551,201,872 bytes copied during GC
   1,312 bytes maximum slop
            1154 MB total memory in use (0 MB lost due to fragmentation)

                                    Tot time (elapsed)  Avg pause  Max pause
  Gen  0     59971 colls,0 par    2.70s    2.70s     0.0000s    0.0002s
  Gen  1        12 colls,0 par    4.23s    4.85s     0.4043s    3.3144s

  INIT    time    0.00s  (  0.00s elapsed)
  MUT     time   11.99s  ( 12.00s elapsed)
  GC      time    6.93s  (  7.55s elapsed)
  EXIT    time    0.00s  (  0.00s elapsed)
  Total   time   18.93s  ( 19.56s elapsed)

  %GC     time      36.6%  (38.6% elapsed)

  Alloc rate    2,611,793,025 bytes per MUT second

  Productivity  63.4% of total user,61.3% of total elapsed

将最大堆大小设置为低于它自然使用的大小,实际上让它适合于Set所需的空间,以较长的GC时间为代价,并且建议堆大小-H1800M让它完成仅使用

1831 MB total memory in use (0 MB lost due to fragmentation)

因此,如果您指定最大堆大小低于2GB(但足够大以使Set适合),它应该工作.

windows – 在Haskell程序中使用所有可用的RAM?的更多相关文章

  1. 响应iOS中的RAM可用性

    退后一步,还有其他一些适用于OpenGL纹理内存的自适应技术吗?

  2. 如何从命令行更改android模拟器RAM大小?

    我想在命令行创建android模拟器时编辑或更改ram大小.EX:在创建模拟器时,它采用默认的ram大小(AndroidSDK4.0.3)512MB但我想将其增加到768MB或减少到256MB.我想改变只有拉姆尺寸.因为有一个选项可以改变Ram的大小.如果你输入了yes,我们需要提供很多东西.解决方法您需要找到已创建的AVD的配置文件.在我的情况下,我在Ubuntu上运行AVD,所以这是我找到配置

  3. Android应用程序在首次启动时开始非常慢,但通常在下次启动时启动

    我使用Eclipse创建了一个非常繁重的应用程序并在4.2.2设备上部署.在第一次启动时,需要相当长的时间才能完全显示UI.在那之后,即使在app杀死并重新启动之后,一切都会很快,需要0.5秒才能启动.这是正常现象,如果是,那么根本原因是什么?

  4. windows – 在Haskell程序中使用所有可用的RAM?

    我有8GB的RAM,但Haskell程序似乎只能使用1.3GB.我正在使用这个简单的程序来确定GHC程序可以分配多少内存:这是我发现的:>运行./mem.exe40000000RTS-s成功并报告正在使用的总内存为1113MB>运行./mem.exe42000000RTS-s因内存不足错误而失败>运行./mem.exe42000000RTS-s-M4G错误输出-M4G:大小超出允许范围>运行./m

  5. 在Windows桌面上调整postgreSQL以利用24GB RAM

    我的pgtune值看起来好吗?我做了一些研究,告诉我:>在Windows上,shared_buffers不应大于512MB,而应使用该系统缓存.问题:我是否必须以某种方式告诉Windows将系统缓存分配给postgresql,否则如果postgresql请求它会自动发生?>work_mem允许数据库服务器在RAM足够大的情况下对RAM进行排序.问题:我的work_mem足够大吗?如何判断是在RAM还是磁盘上进行排序?我将非常感谢任何有助于加快此查询的见解.谢谢!

  6. 可编程RAM磁盘API for .NET?

    寻找一个RAM磁盘API(或等效的软件实现)来临时存储文件,用于物理硬盘环境之外的读/写操作.更新Exe文件将被写入RAM磁盘并执行.“RAM磁盘”是操作系统级的结构,因为它必须实现一个文件系统和设备驱动程序来模拟一个磁盘.您不能在图书馆级别执行此操作.如果你想追求操作系统级别,Windows自带一个内置的ramdisk.sys驱动程序.否则,将文件读入应用程序中的数据结构将具有与使用RAM磁盘相

  7. windows – Haskell,GHC,win32,cairo

    我怀疑你遇到了很多我刚刚做过的问题.我最近在Haskell和ZeroMQ在Windows上做了一些事情.GHC在Windows上运行,ZeroMQ有一个MingW32端口,并且有一个标准的ZeroMQCabal包,所以我认为这将工作.然而:>GHC仅部分支持Windows上的动态链接.见here.>ZeroMQCabal软件包取决于libzmq的静态版本.>GHC在Windows上使用MingW32约定其库和dll.>ZeroMQ只在他们的MingW32端口中构建一个动态的.dll,而不是.a静态存档.我

  8. centos – mdadm Raid-1是否可以通过网络文件共享?

    我使用的是64位CentOS5.5我知道可以使用物理硬盘和RAM磁盘使用mdadm设置软件RAID1.是否可以使用NFS挂载和RAM磁盘设置mdadm软件RAID1?或者另一种提出问题的方法是,NFS挂载是否可以成为与mdadm一起使用的块设备?

  9. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部