我正在編寫一個程序,對文件中的示例數據執行轉換。我通過讀取文件來完成這一操作,將內容轉換爲矢量,對矢量執行轉換,然後將矢量寫回文件。我已經(想)我有一種有效的方式來閱讀文件,並將其內容轉換爲矢量,但我仍然在尋找一種有效的方法將結果向量寫回內存。高效地將矢量轉換並寫入句柄
該文件中的示例是24位整數(3個字節),我通過規範化它們以將它們轉換爲浮點數。
我通過ByteString.hGet
讀取所有樣本,將文件內容轉換爲向量。然後,我可以簡單地使用Vector.generate
將ByteString
的每3個字節轉換爲一個樣本。
我的問題是將結果寫回文件。至少我覺得有一個問題。我目前的轉化載體,並寫入文件,如下所示:通過
import Data.Vector.Unboxed as U
import Data.ByteString as BS
putSamples :: Handle -> U.Vector Float -> IO()
putSamples h vec = U.forM_ vec (BS.hPut h . BS.pack . unconvert 3 . Int)
正如你所看到的,我第一次被轉換Float
回到一個Int
去正常化它,打開Int
到3個字節將unconvert 3
,pack
的結果轉換成的3字節,然後通過ByteString.pack
將結果寫入ByteString.hPut
的句柄。
這似乎非常低效,因爲我打電話給每個樣品hPut
。有沒有辦法更有效地做到這一點?
我可能會換'U.Vector Float'在'newtype'並創建'Data.Serialize.Serialize'一個實例。我相信這將有效地構建一個緩衝區,然後可以在一個操作中寫入。 – ryachza