我有一个服务器程序,从一组网络对等体中随机选择10来完成任务.生成对等体随机索引的代码如下:
indices = let index = getStdRandom $ randomR (0, number_of_peers - 1)
in sequence $ replicate 10 index
Run Code Online (Sandbox Code Playgroud)
该程序已经运行了几个月,每天产生数千个"索引",并且一直工作到昨天,当我注意到出现问题时:生成的随机数似乎"收敛"到一些重复值(结果是相应的网络对等体负载很重).
要查看更改,以下是几天前的服务器日志:
peers selected: [55,47,80,74,183,85,04,33,72,58]
Run Code Online (Sandbox Code Playgroud)
和今天的日志(如你所见,重复选择对等53,37和195):
peers selected: [53,53,37,37,37,37,195,195,195,21]
Run Code Online (Sandbox Code Playgroud)
该程序在x86_64版本的Ubuntu 10.10上运行.
所以最初我写道:
xs <- getAddrInfo (Just hints) (Just addr) (Just port)
Run Code Online (Sandbox Code Playgroud)
那么在我看来,函数'Just :: a - > Maybe a'有点"映射"在'hints','addr'和'port'上,所以我提出了类似这样的东西:
map_arg g f a b c = f (g a) (g b) (g c)
xs <- map_arg Just getAddrInfo hints addr port
Run Code Online (Sandbox Code Playgroud)
但GHC期望(ga),(gb)和(gc)属于同一类型,因此不进行类型检查.
有没有办法做到这一点,或者更一般地说,有没有办法将函数映射到另一个函数的参数?
我试图在嵌入式Linux框中使用`dd'命令在VFAT分区上创建一个大的空文件:
dd if=/dev/zero of=/mnt/flash/file bs=1M count=1 seek=1023
Run Code Online (Sandbox Code Playgroud)
目的是跳过前1023个块并在文件末尾只写一个块,这在原生EXT3分区上应该非常快,而且确实如此.但是,此操作在VFAT分区上变得非常慢,并伴有以下消息:
lowmem_shrink:: nr_to_scan=128, gfp_mask=d0, other_free=6971, min_adj=16
// ... more `lowmem_shrink' messages
Run Code Online (Sandbox Code Playgroud)
另一种尝试是在VFAT分区上fopen()一个文件然后fseek()到最后写入数据,这也被证明是慢的,以及来自内核的相同消息.
基本上,有没有一种快速的方法在VFAT分区上创建文件(不遍历前1023块)?
谢谢.