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... ]