LINUX.ORG.RU

Haskell: пара вопросов


0

0

1. Делаю файлу: take M $ drop N fd. При больших N, где-то сдвиг в
файле ~ 1МБ, вылетает с переполнением. Если последовательно идти до
некоторой позиции в файле, т.е. с некоторым инкрементом (N+=S), то
всё - ОК. Как лечится ???

2. Как замутить таймер ? Надо чтоб через равныее промежутки времени
запускался обработчик прерывания от таймера (конец счёта).


>1. Делаю файлу: take M $ drop N fd. При больших N, где-то сдвиг в файле ~ 1МБ, вылетает с переполнением. Если последовательно идти до некоторой позиции в файле, т.е. с некоторым инкрементом (N+=S), то всё - ОК. Как лечится ???

Покажи код, попробуй ByteString.Lazy использовать

2. Как замутить таймер ? Надо чтоб через равныее промежутки времени запускался обработчик прерывания от таймера (конец счёта).

System.Glib.MainLoop timeoutAdd можно, или forkOS и в нем threadDelay - но это неточно будет.

imp ★★
()
Ответ на: комментарий от imp

> Покажи код, попробуй ByteString.Lazy использовать

Ну собственно Lazy и использую

fd <- decodeFile filename :: IO [Int16]
let x1 = take nS $ drop NN fd
.....

Хм... или может ByteString.Lazy получить из файла, ему drop (из
Lazy), а только потом уже decode в Int16 ? 

brahman
() автор топика
Ответ на: комментарий от brahman

И ещё, как максимально быстро вычитать кусок (нужного размера) данных из любого места в файле ? Файл может быть сильно здоровый.

brahman
() автор топика
Ответ на: комментарий от imp

Слушай, а вот как можно соптимизировать эту ф-цию:

findDat :: [Int16] -> Int -> [Int16]
findDat (x:xs) n = 
    if (((((\x -> rotate x 8) x)) .&. 0xF000)==0) then
        if ((((\x -> rotate x 8) (head xs)) .&. 0xFF)==2) then 
           do let y1 = (\x -> rotate x 8) $ head $ take 1 $ drop 3 xs
              if(y1==1024) then do
                    .... ??? -- Здесь возврат xs ([Int16])
                           else findDat xs n
                                                           else ...
                                                   else findDat xs n

Здесь, на вход подаётся выхлоп (decodeFile "lala" :: IO [Int16]).
Далее, находим блок данных по определённым признакам (не важно). 
Кроме оптимизации вопрос ещё: как вернуть [Int16] после 
if(y1==1024) then do - это значит, что выполнились все условия и 
надо передать xs на выход.

brahman
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.