أتوبارسيك:تخطي المصطلحات بين قوسين?
-
13-12-2019 - |
سؤال
أحاول جعل ملفات تسف كبيرة مع جسون في العمود 5 مناسبة للاستيراد إلى مونغودب.على وجه الخصوص ، أريد تغيير المستوى الأعلى وحقول مفتاح المستوى الأعلى فقط إلى معرف.هذا ما لدي حتى الآن ، يبدو أنه يعمل ولكنه بطيء:
{-# LANGUAGE OverloadedStrings #-}
import System.Environment (getArgs)
import Data.Conduit.Binary (sourceFile, sinkFile)
import Data.Conduit
import qualified Data.Conduit.Text as CT
import qualified Data.Conduit.List as CL
import qualified Data.Text as T
import Data.Monoid ((<>))
import Data.Attoparsec.Text as APT
import Control.Applicative
main = do
(inputFile : outputFile : _) <- getArgs
runResourceT $ sourceFile inputFile
$= CT.decode CT.utf8 $= CT.lines $= CL.map jsonify
$= CT.encode CT.utf8 $$ sinkFile outputFile
jsonify :: T.Text -> T.Text
jsonify = go . T.splitOn "\t"
where
go (_ : _ : _ : _ : content : _) = case parseOnly keyTo_id content of
Right res -> res <> "\n"
_ -> ""
go _ = ""
keyTo_id :: Parser T.Text
keyTo_id = skipWhile(/='{') >> T.snoc <$>
(T.cons <$> (char '{')
<*> (T.concat <$> many1 ( bracket
<|> (string "\"key\":" >> return "\"_id\":")
<|> APT.takeWhile1(\x -> x /= '{' && x /= '}' && x/= '"')
<|> T.singleton <$> satisfy (/= '}')
)))
<*> char '}'
bracket :: Parser T.Text
bracket = T.cons <$> char '{'
<*> scan 1 test
where
test :: Int -> Char -> Maybe Int
test 0 _ = Nothing
test i '}'= Just (i-1)
test i '{' = Just (i+1)
test i _ = Just i
وفقا لملف التعريف ، يتم إنفاق 58.7 ٪ من الوقت بين قوسين ، و 19.6 ٪ في معرف المفتاح ، و 17.1 ٪ بشكل رئيسي.
بالتأكيد هناك طريقة أفضل لإرجاع المصطلحات الموضوعة بين قوسين دون تغيير إذا تطابق الأقواس?
نظرت لفترة وجيزة في أتوبارسيك قناة ، ولكن ليس لدي أي فكرة عن كيفية استخدام تلك المكتبة ولا يمكن حتى معرفة ما إذا كان هذا هو نوع من الشيء الذي يمكن استخدامه ل.
تحرير:تحديث التعليمات البرمجية.البيانات من openlibrary.org ، ه.g. http://openlibrary.org/data/ol_dump_authors_latest.txt.gz
المحلول
استخدام scan
وظيفة.انها تسمح لك لمسح أكثر من سلسلة صيانة الدولة.في حالتك ستكون الدولة رقم-الفرق بين فتح وإغلاق الأقواس التي واجهتها حتى الآن.عندما تكون حالتك 0 ، فهذا يعني أن الأقواس تتطابق داخل السلسلة الفرعية الحالية.
الحيلة هي أنك لا تفكيك وإعادة بناء السلسلة بهذه الطريقة ، لذلك ينبغي أن يكون أسرع.
أيضا ، هل يمكن الحصول على بعض الأداء حتى مع الخوارزمية الحالية باستخدام النص كسول-و concat
وظيفة ستعمل بشكل أكثر كفاءة.