gnucash maint: Multiple changes pushed

John Ralls jralls at
Sun Aug 2 14:52:25 EDT 2020

Updated	 via (commit)
	 via (commit)
	 via (commit)
	 via (commit)
	 via (commit)
	 via (commit)
	from (commit)

commit efc34b247f4caa611b8967ee5e233ef3a94e155b
Merge: ea2d89fac a9f79cf79
Author: John Ralls <jralls at>
Date:   Sun Aug 2 11:20:50 2020 -0700

    Merge Jean Laroche's  'improve_ofx_import_speed' into maint.

commit a9f79cf79c6b681428eaee78a5bca8f192e33b98
Author: jean <you at>
Date:   Tue Jul 21 13:39:26 2020 -0700

    Add a flag to the account structure to defer balance computation

commit 1f592ce1914f1db3f9845f5e8898a413cafb1794
Author: jean <you at>
Date:   Tue Jul 21 12:19:28 2020 -0700

    Fix FOO and move deletion where it should be

commit 2be2ff8af452e887db29f41235238aad2f2ce77c
Author: jean <you at>
Date:   Sun Jul 19 23:02:53 2020 -0700

    To further increase the import speed, it's necessary to prevent any account commit to happen
    until the very end of the import (OK or Cancel), because account commits trigger very lengthy balance
    computations. For this, I call xaccAccountBeginEdit on all the accounts involved in the import,
    keeping a list of them so BeginEdit is called only once. At the end of the import, commit is called
    on all the accounts in the list. Note that when the user selects a target account for an imported
    transaction, xaccAccountBeginEdit is called on the target account, and it is added to the list.
    Another area of improvement is avoiding re-checking all register transactions to verify whether
    a given imported transaction has already been matched. Instead, a hash table of split online IDs
    is computed once (per account), and verified for each incoming transactions.
    Finally, the list of register transactions that are potential matches for the imported ones is
    further pruned ahead of time to only keep transactions that do not have an online ID. This avoid
    the repeated checks that were previously happening in the match-score loop.
    With this, importing 6000 transactions into a 6000 split account becomes fairly fast (a few seconds
    on my slowish machine).
    There are still slow areas: If you select all 6000 imported transactions and assign a destination
    account to all of them, the process is impossibly sluggish because of repeated path operations
    (selections, freeing) in the tree view.
    If you do not specify a target account for any of the 6000 imported transactions, an "imbalance"
    account is used, but the xaccAccountBeginEdit mechanism isn't applied to it by the new code, so
    each imported transaction will trigger a commit, and therefore a slow balance recomputation.
    Remove use of xaccTransGetSplit

commit 0da826f31161fd51ca45b3a6274cae37282fa9b0
Author: jean <you at>
Date:   Fri Jul 17 18:52:01 2020 -0700

    Instead of saving the imported transaction into the treeview, which takes more time
    I now save them into a temporary list. A single query is done for all imported transactions
    and the resulting register splits are put into a hash table of lists with accounts
    as key, which will speed things up when multiple accounts are found.
    My tests of large imports on large accounts seems to ate that most of the time is spent
    verifying whether the imported transactions has already been imported, then computing
    the balance repeatedly for each imported transaction (!)  when the user clicks OK to
    add all the transactions to the account. So there's still room for improvement here!

commit 85515214767cbafd7489d4edebe2dbce49c5d61f
Author: jean <you at>
Date:   Mon May 11 22:19:35 2020 -0700

    Speeds up the import of ofx files by only doing one query at the end.
    The previous ofx import code performed one query for each imported transactions, which
    was quite slow. The change consists of gathering all ofx transactions before doing the
    query. The query must be wider to search for all matching accounts (in case the imported
    transactions come from different accounts) and an enlarge date range (according to the
    earliest and latest imported transaction). The rest of the code is identical to what was
    done before. The final query is performed just before the matching dialog is displayed.

Summary of changes:
 gnucash/import-export/import-backend.c             | 120 ++++--------
 gnucash/import-export/import-backend.h             |  34 +---
 gnucash/import-export/import-main-matcher.c        | 209 ++++++++++++++++++---
 .../import-export/test/gtest-import-backend.cpp    |   7 +
 libgnucash/engine/Account.cpp                      |  25 ++-
 libgnucash/engine/Account.h                        |  15 +-
 libgnucash/engine/AccountP.h                       |   1 +
 libgnucash/engine/mocks/gmock-Transaction.cpp      |   7 +
 libgnucash/engine/mocks/gmock-Transaction.h        |   1 +
 9 files changed, 286 insertions(+), 133 deletions(-)

More information about the gnucash-patches mailing list