Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将样本从文件读入数组_Arrays_Haskell_Bytestring_Repa - Fatal编程技术网

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将所有样本读入一个
  • 我知道每个示例都由3个字节表示,因此我将
    ByteString
    分组到一个3个字节的
    ByteString
    s列表中
  • 我通过testring将我的
    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对不起,我不允许分享代码。