我正在浏览矢量库并发现了一个{-# INLINE_FUSED transform #-},我想知道它是做什么的?我看到它定义在vector.h其他地方.
我有一个10GB Data.Vector.Unboxed向量,我想有效地保存到磁盘.什么是最好,最有效的方式?我打算从内存映射文件中读取它.
我已经看过这个包这个包但只适用于Storable,但我需要保持unboxed.
我在考虑转换到列表,但我认为这不是很理想.
我有以下程序,它不会编译; 它只是被困在Compiling Main.我不知道为什么它会冻结,因为它是一个错误或我错过了什么?
import qualified Data.Vector.Unboxed as V
test :: [Int]
test = V.foldl' unique [] k
where
n = 10000000
k = V.generate n (\i -> i `div` 1000 * 1000)
unique [] k = [k]
unique acc@(ck:_) k
| k == ck = acc
| otherwise = k:acc
main :: IO ()
main = print $ head test
Run Code Online (Sandbox Code Playgroud)
ghc --make -O3 -Odph -fllvm test.hs
我是Haskell的新手,我想创建一个直方图.我正在使用Data.Vector.Unboxed融合数据操作; 这是快速的(当使用-O -fllvm编译时)和瓶颈是我的折叠应用程序; 汇总了桶数.
我怎样才能让它更快?我读过关于通过保持严格要求来减少thunk的数量,所以我通过使用seq和foldr来严格限制,但没有看到太多的性能提升.强烈鼓励您的想法.
import qualified Data.Vector.Unboxed as V
histogram :: [(Int,Int)]
histogram = V.foldr' agg [] $ V.zip k v
where
n = 10000000
c = 1000000
k = V.generate n (\i -> i `div` c * c)
v = V.generate n (\i -> 1)
agg kv [] = [kv]
agg kv@(k,v) acc@((ck,cv):as)
| k == ck = let a = (ck,cv+v):as in a `seq` a
| otherwise = let a = kv:acc in a `seq` a
main …Run Code Online (Sandbox Code Playgroud) 我一直在编写直方图,我在这里得到了很多帮助.我一直使用哈希表对直方图进行编码,以存储密钥和频率值,因为密钥的分布是未知的; 所以它们可能不会被分类或连续组合在一起.
我的代码的问题在于它在GC中花费了太多时间,因此在GC中花费的时间看起来像空间泄漏60.3% - 所以我的生产率差39.7%.
出了什么问题?我试图在直方图函数中对事物进行严格处理,并且我也在内联它(GC时间从69.1%变为59.4%.)
请注意我通过不更新HT中的频率来简化此代码.
{-# LANGUAGE BangPatterns #-}
import qualified Data.HashTable.IO as H
import qualified Data.Vector as V
type HashTable k v = H.BasicHashTable k v
n :: Int
n = 5000000
kv :: V.Vector (Int,Int)
kv = V.zip k v
where
k = V.generate n (\i -> i `mod` 10)
v = V.generate n (\i -> 1)
histogram :: V.Vector (Int,Int) -> Int -> IO (H.CuckooHashTable Int Int)
histogram vec !n = do
ht <- H.newSized …Run Code Online (Sandbox Code Playgroud) 我很想知道在Haskell中通过网络发送10 GB的最佳方法是什么?我不想将其作为二进制发送而无需编写解码/编码器.保持严格或懒惰是最好的吗?
我正在学习C++,我遇到了这个函数的问题.我最初传递了整个向量,然后传递了一个指向向量的指针; 但我似乎无法从指向矢量的指针赋值.
void fill(std::vector<int> *vec, const int startVal)
{
const int n = vec->size();
for (int i = 0; i < n; ++i)
{
vec[i] = startVal + i
}
}
Run Code Online (Sandbox Code Playgroud)
如何在指针(vec)的第i个位置为向量分配值?
我试过了:
vec->[i] = startVal + i;
Run Code Online (Sandbox Code Playgroud)