[前][次][番号順一覧][スレッド一覧]

haskell-jp:381

From: Uchida Yasuo <kg6y_ucd@y...>
Date: Wed, 2 Sep 2009 02:55:50 +0900 (JST)
Subject: [haskell-jp:381] Data.ByteString.Lazy.Char8.elemIndicesのバグ?

はじめまして、内田と申します。

テキストファイルの改行のバイト位置を出力するために、Data.ByteString.Lazy.Char8.elemIndicesを使ったプログラムを書いてみたのですが、正しく改行位置を出力してくれません。ファイルサイズは数百メガバイト以上を想定しています。
次は問題の動作を見るために単純化して(行数+1)を出力するようにしたプログラムです。(プログラム中のようにputStrLnを2回重ねると、より状態が悪くなります。。。)

elemIndicesのソース(http://hackage.haskell.org/packages/archive/bytestring/0.9.1.4/doc/html/src/Data-ByteString-Lazy.html)を眺めてみましたが、見当がつきませんでした。このような経験をされた方いらっしゃいませんか?


-- bug.hs --
import Data.Int
import qualified Data.ByteString.Lazy.Char8 as L

main = do
 cs <- L.getContents
 let ps = 0 : (map (+1) $ L.elemIndices '\n' cs) -- bug?
 -- let ps = 0 : (map (+1) $ indices '\n' cs) -- 修正例
 putStrLn $ "length ps = " ++ (show $ length ps)
 putStrLn $ "length ps = " ++ (show $ length ps)

indices :: Char -> L.ByteString -> [Int64]
indices c = indices' c 0

indices' :: Char -> Int64 -> L.ByteString -> [Int64]
indices' c n xs = case L.elemIndex c xs of
                   Nothing -> []
                   Just y  -> let !k = n + y
                              in k : indices' c (k + 1) (L.drop (y + 1) xs)
-- 
(再現方法)
以下の環境で試しています。
 - Mac OS X 10.5.8 + GHC6.10.3
 - Windows XP + GHC6.10.4
 - ubuntu 8.04 + GHC6.8.3

Mac OSで実行すると次のようになります。(length ps = 10000001と表示されることを期待していますが、次のようになってしまいます。また、実行する度に結果が変わります。)

$ yes | head -10000000 | ./bug
length ps = 9998308
length ps = 9998308
$ yes | head -10000000 | ./bug
length ps = 9994798
length ps = 9994798
$ 

\c -> findIndices (==c)や、elemIndexを繰り返し呼ぶ自前のindicesではうまくいくようです。

[前][次][番号順一覧][スレッド一覧]

->     381 2009-09-02 02:55 [kg6y_ucd@y...       ] Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       382 2009-09-02 03:10 ┣[kg6y_ucd@y...       ] Re: [haskell-jp:381] Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       383 2009-09-02 10:05 ┣[shelarcy@g...       ] Re: [haskell-jp:381] Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       384 2009-09-02 10:51 ┃┗[m584iii@g...        ] Re: Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       386 2009-09-03 01:08 ┃ ┗[kg6y_ucd@y...       ] Re: [haskell-jp:384] Re: Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       385 2009-09-02 11:51 ┗[nonowarn@g...       ] Re: [haskell-jp:381] Data.ByteString.Lazy.Char8.elemIndicesのバグ?
       387 2009-09-03 01:22  ┗[kg6y_ucd@y...       ]                                     
       389 2009-09-03 22:42   ┗[nonowarn@g...       ]                                   
       390 2009-09-04 01:11    ┗[kg6y_ucd@y...       ]                                 
       393 2009-09-09 21:50     ┗[kg6y_ucd@y...       ]                               
       394 2009-09-09 22:31      ┗[nonowarn@g...       ]                             
       395 2009-09-12 03:38       ┗[kg6y_ucd@y...       ]                           
       396 2009-09-13 11:42        ┗[nonowarn@g...       ]                         
       397 2009-09-13 11:47         ┗[nonowarn@g...       ]                       
       398 2009-09-13 15:12          ┣[shelarcy@g...       ]                     
       400 2009-09-13 19:17          ┃┗[kg6y_ucd@y...       ]                   
       399 2009-09-13 16:44          ┗[kg6y_ucd@y...       ]                     
       409 2009-10-05 22:37           ┗[shelarcy@g...       ]                   
       410 2009-10-05 23:41            ┗[nonowarn@g...       ]