Я пытаюсь обрабатывать данные Point Cloud с помощью Haskell, и, похоже, он использует много памяти. Код, который я использую, приведен ниже, он в основном анализирует данные в формате, с которым я могу работать. Набор данных имеет 440 МБ с 10 М строк. Когда я запускаю его с runhaskell
, он использует все баран в течение короткого времени (~ 3-4gb), а затем сработает. Если я скомпилирую его с -O2
и запустил его, он перейдет на 100% процессор и займет много времени (~ 3 минуты). Я должен упомянуть, что я использую i7 cpu с 4 ГБ оперативной памяти и SSD, поэтому должно быть много ресурсов. Как я могу улучшить производительность?Haskell скорость/использование памяти
{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (lines, readFile)
import Data.Text.Lazy (Text, splitOn, unpack, lines)
import Data.Text.Lazy.IO (readFile)
import Data.Maybe (fromJust)
import Text.Read (readMaybe)
filename :: FilePath
filename = "sample.txt"
readTextMaybe = readMaybe . unpack
data Classification = Classification
{ id :: Int, description :: Text
} deriving (Show)
data Point = Point
{ x :: Int, y :: Int, z :: Int, classification :: Classification
} deriving (Show)
type PointCloud = [Point]
maybeReadPoint :: Text -> Maybe Point
maybeReadPoint text = parse $ splitOn "," text
where toMaybePoint :: Maybe Int -> Maybe Int -> Maybe Int -> Maybe Int -> Text -> Maybe Point
toMaybePoint (Just x) (Just y) (Just z) (Just cid) cdesc = Just (Point x y z (Classification cid cdesc))
toMaybePoint _ _ _ _ _ = Nothing
parse :: [Text] -> Maybe Point
parse [x, y, z, cid, cdesc] = toMaybePoint (readTextMaybe x) (readTextMaybe y) (readTextMaybe z) (readTextMaybe cid) cdesc
parse _ = Nothing
readPointCloud :: Text -> PointCloud
readPointCloud = map (fromJust . maybeReadPoint) . lines
main = (readFile filename) >>= (putStrLn . show . sum . map x . readPointCloud)
Не используйте List, конвертируйте этот список в вектор. Кроме того, использование тестовой памяти с помощью двоичных файлов, о которых вы знаете, у вас есть оптимизация. – bitemyapp
@bitemyapp, как я уже говорил выше, я пробовал использовать «-O2», и, хотя он не заполняет память, он по-прежнему очень медленный. –
Преобразование списка в вектор. – bitemyapp