Arrays 将样本从文件读入数组
我已经编写了一个程序,分析包含在文件中的样本数据。目前,我的程序将样本读取到一个列表中,我对样本列表执行进一步的分析/处理(Arrays 将样本从文件读入数组,arrays,haskell,bytestring,repa,Arrays,Haskell,Bytestring,Repa,我已经编写了一个程序,分析包含在文件中的样本数据。目前,我的程序将样本读取到一个列表中,我对样本列表执行进一步的分析/处理([Float]) 我对性能不是很满意,我正在考虑使用数组而不是列表来获得更好的性能。我也在研究并行化我的实现,Data.Array.Repa看起来很有希望 目前,从文件读取的过程如下: 我使用hGet通过testring将所有样本读入一个中 我知道每个示例都由3个字节表示,因此我将ByteString分组到一个3个字节的ByteStrings列表中 我通过testring将
[Float]
)
我对性能不是很满意,我正在考虑使用数组而不是列表来获得更好的性能。我也在研究并行化我的实现,Data.Array.Repa
看起来很有希望
目前,从文件读取的过程如下:
hGet
通过testring将所有样本读入一个中
ByteString
分组到一个3个字节的ByteString
s列表中toFloat
函数映射到列表上,以获得Float
s列表李>
这导致我分析[Float]
以获得所需的信息
我想知道在这个过程中应该从哪一步开始使用数组。我首先考虑使用listArray
函数将我的[Float]
转换为一个浮点数组。我不确定,但这似乎不是最有效的方法
是否可以在步骤2之后使用Data.Array.Repa.fromFunction
构建数组,并跳过中间的[Float]
?对于函数,我是否可以使用类似于(map-toFloat-bsList)
?其中,bsList
是分组后的ByteString
s列表
或者有没有办法将样本直接读取到数组中 Repa实际上能够在ByteString上作为阵列的后端进行操作。因此,您可以通过在下注右侧并行地进行TestRing来开始处理,方法是沿以下路线进行尝试:
#!/usr/bin/env stack
-- stack runghc --package repa
import Data.ByteString as BS
import Data.Array.Repa as R
import Data.Array.Repa.Repr.ByteString as R
getFloatsArr :: ByteString -> Array D DIM1 Float
getFloatsArr bs = R.traverse strArr (\(Z :. n) -> Z :. (n `div` 3)) getFloat where
strArr = R.fromByteString (Z :. BS.length bs) bs
getFloat getWord8 (Z :. k) =
toFloat (getWord8 (Z :. k*3)) (getWord8 (Z :. k*3+1)) (getWord8 (Z :. k*3+2))
toFloat = undefined -- convert to `Float` from 3 `Word8`s
processFurther :: Array U DIM1 Float -> a
processFurther = undefined
main :: IO ()
main = do
bs <- BS.readFile "file.txt"
arr <- R.computeUnboxedP $ getFloatsArr bs
processFurther arr
return ()
#/usr/bin/env堆栈
--堆栈runghc—包repa
将Data.ByteString作为BS导入
将Data.Array.Repa作为R导入
将Data.Array.Repa.Repr.ByteString作为R导入
getFloatsArr::ByteString->Array D DIM1 Float
getFloatsArr bs=R.traverse strArr(\(Z:.n)->Z:.(n`div`3))getFloat其中
strArr=R.fromByteString(Z:.BS.length BS)BS
getFloat getWord8(Z:.k)=
toFloat(getWord8(Z:.k*3))(getWord8(Z:.k*3+1))(getWord8(Z:.k*3+2))
toFloat=未定义--从3'Word8'转换为'Float'
processFurther::数组U DIM1浮点->a
processFurther=未定义
main::IO()
main=do
如果你的程序很小,也可以发布(或链接)它。这将使我们的答案更加具体(和可验证)。@Alec对不起,我不允许分享代码。