@@ -65,6 +65,7 @@ import Cardano.Slotting.Slot (
6565 at ,
6666 fromWithOrigin ,
6767 )
68+ import Codec.CBOR.Write (toBuilder )
6869import Control.Concurrent.Class.MonadSTM.Strict (
6970 atomically ,
7071 newTVarIO ,
@@ -74,6 +75,17 @@ import Control.Concurrent.Class.MonadSTM.Strict (
7475import Control.Concurrent.STM.TBQueue (TBQueue , newTBQueueIO , readTBQueue , writeTBQueue )
7576import qualified Control.Exception as Exception
7677import qualified Data.ByteString.Base16 as Base16
78+ <<<<<<< HEAD
79+ =======
80+
81+ import Cardano.DbSync.Api.Types (InsertOptions (.. ), LedgerEnv (.. ), SyncOptions (.. ))
82+ import Cardano.DbSync.Error (SyncNodeError (.. ), fromEitherSTM )
83+ import Cardano.Ledger.BaseTypes (StrictMaybe )
84+ import Cardano.Ledger.Conway.Core as Shelley
85+ import Cardano.Ledger.Conway.Governance
86+ import qualified Cardano.Ledger.Conway.Governance as Shelley
87+ import qualified Data.ByteString.Builder as Builder
88+ >>>>>>> cc58d4e7 (perf improvements RAM )
7789import qualified Data.ByteString.Char8 as BS
7890import qualified Data.ByteString.Lazy.Char8 as LBS
7991import qualified Data.ByteString.Short as SBS
@@ -121,6 +133,7 @@ import Ouroboros.Network.Block (HeaderHash, Point (..))
121133import qualified Ouroboros.Network.Point as Point
122134import System.Directory (doesFileExist , listDirectory , removeFile )
123135import System.FilePath (dropExtension , takeExtension , (</>) )
136+ import qualified System.IO as IO
124137import System.Mem (performMajorGC )
125138import Prelude (String , id )
126139
@@ -376,6 +389,7 @@ ledgerStateWriteLoop tracer swQueue codecConfig =
376389 writeLedgerStateFile :: FilePath -> CardanoLedgerState -> IO ()
377390 writeLedgerStateFile file ledger = do
378391 startTime <- getCurrentTime
392+ <<<<<<< HEAD
379393 -- TODO: write the builder directly.
380394 -- BB.writeFile file $ toBuilder $
381395 LBS. writeFile file $
@@ -388,14 +402,26 @@ ledgerStateWriteLoop tracer swQueue codecConfig =
388402 . forgetLedgerTables
389403 )
390404 ledger
405+ =======
406+ -- Use streaming builder to avoid loading entire state into memory
407+ IO. withBinaryFile file IO. WriteMode $ \ h -> do
408+ let encoding =
409+ encodeCardanoLedgerState
410+ ( Consensus. encodeExtLedgerState
411+ (encodeDisk codecConfig)
412+ (encodeDisk codecConfig)
413+ (encodeDisk codecConfig)
414+ )
415+ ledger
416+ Builder. hPutBuilder h (toBuilder encoding)
417+ >>>>>>> cc58d4e7 (perf improvements RAM )
391418 endTime <- getCurrentTime
392419 logInfo tracer $
393420 mconcat
394421 [ " Asynchronously wrote a ledger snapshot to "
395422 , Text. pack file
396423 , " in "
397424 , textShow (diffUTCTime endTime startTime)
398- , " ."
399425 ]
400426
401427mkLedgerStateFilename :: LedgerStateDir -> ExtLedgerState CardanoBlock mk -> Maybe EpochNo -> WithOrigin FilePath
@@ -641,12 +667,13 @@ loadLedgerStateFromFile tracer config delete point lsf = do
641667 safeReadFile :: FilePath -> IO (Either Text CardanoLedgerState )
642668 safeReadFile fp = do
643669 startTime <- getCurrentTime
644- mbs <- Exception. try $ BS. readFile fp
670+ -- Use lazy ByteString to enable streaming read
671+ mbs <- Exception. try $ LBS. readFile fp
645672 case mbs of
646673 Left (err :: IOException ) -> pure $ Left (Text. pack $ displayException err)
647- Right bs -> do
674+ Right lbs -> do
648675 mediumTime <- getCurrentTime
649- case decode bs of
676+ case decode lbs of
650677 Left err -> pure $ Left $ textShow err
651678 Right ls -> do
652679 endTime <- getCurrentTime
@@ -656,7 +683,7 @@ loadLedgerStateFromFile tracer config delete point lsf = do
656683 , renderPoint point
657684 , " . It took "
658685 , textShow (diffUTCTime mediumTime startTime)
659- , " to read from disk and "
686+ , " to read from disk (streaming) and "
660687 , textShow (diffUTCTime endTime mediumTime)
661688 , " to parse."
662689 ]
@@ -665,12 +692,11 @@ loadLedgerStateFromFile tracer config delete point lsf = do
665692 codecConfig :: CodecConfig CardanoBlock
666693 codecConfig = configCodec config
667694
668- decode :: ByteString -> Either DecoderError CardanoLedgerState
669- decode = do
695+ decode :: LBS. ByteString -> Either DecoderError CardanoLedgerState
696+ decode =
670697 Serialize. decodeFullDecoder
671698 " Ledger state file"
672699 decodeState
673- . LBS. fromStrict
674700
675701 decodeState :: (forall s . Decoder s CardanoLedgerState )
676702 decodeState =
0 commit comments