Inline plugin - iterating over items for album_fields significantly slows down operations
Problem
Using even a simple album_field definition such as:
album_fields:
album_bitrate: |
total = 0
for item in items:
total += item.bitrate
significantly degrades performance.
Without:
root@6ea1b5cf64a4:/# time beet move -p 'title:Von dutch'
Moving 3 items.
[...]
real 0m2.702s
user 0m4.211s
sys 0m0.399s
With:
Moving 3 items.
[...]
real 0m15.705s
user 0m5.028s
sys 0m1.892s
With more items, it was significantly worse:
w/o:
root@6ea1b5cf64a4:/# time beet move -p 'artist:Charli XCX'
Moving 175 items.
[...]
real 0m5.264s
user 0m6.991s
sys 0m0.467s
with: (I actually gave up letting it run)
Moving 175 items.
[...]
^CTraceback (most recent call last):
File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1870, in main
_raw_main(args)
File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1849, in _raw_main
subcommand.func(lib, suboptions, subargs)
File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2216, in move_func
move_items(
File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2146, in move_items
objs = [o for o in objs if (isalbummoved if album else isitemmoved)(o)]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands.py", line 2141, in isitemmoved
return item.path != item.destination(basedir=dest)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1115, in destination
subpath = self.evaluate_template(subpath_tmpl, True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 701, in evaluate_template
return t.substitute(
^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 559, in substitute
res = self.interpret(values, functions)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 552, in interpret
return self.expr.evaluate(Environment(values, functions))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 240, in evaluate
out.append(part.evaluate(env))
^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 177, in evaluate
arg_vals = [expr.evaluate(env) for expr in self.args]
^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 240, in evaluate
out.append(part.evaluate(env))
^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/util/functemplate.py", line 145, in evaluate
if self.ident in env.values:
^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen _collections_abc>", line 813, in __contains__
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 489, in __getitem__
value = self._get(key)
^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 475, in _get
return self._get_formatted(self.album, key)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 124, in _get_formatted
value = model._type(key).format(model.get(key))
^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 449, in _get
return getters[key](self)
^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beetsplug/inline.py", line 120, in _func_func
func.__globals__.update(_dict_for(obj))
^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beetsplug/inline.py", line 102, in _dict_for
out["items"] = list(obj.items())
^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1295, in items
return self._db.items(dbcore.MatchQuery("album_id", self.id))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1697, in items
return self._fetch(Item, query, sort or self.get_default_item_sort())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/library.py", line 1675, in _fetch
return super()._fetch(model_cls, query, sort)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 1257, in _fetch
rows = tx.query(sql, subvals)
^^^^^^^^^^^^^^^^^^^^^^
File "/lsiopy/lib/python3.12/site-packages/beets/dbcore/db.py", line 956, in query
cursor = self.db._connection().execute(statement, subvals)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
real 5m15.560s
user 0m19.222s
sys 0m36.162s
Setup
- OS: Unraid/Docker (linuxserver.io image)
- Python version: Python 3.12.10
- beets version: beets version 2.3.0
- Turning off plugins made problem go away (yes/no): Yes
My configuration (output of beet config) is:
directory: /music/music
# --------------- Main ---------------
library: /config/library.db
pluginpath: /config/plugins
# --------------- Plugins ---------------
plugins:
- embedart
- fetchart
- info
- albumtypes
- lastgenre
- yearfixer
- fromfilename
- mbsync
- mbsubmit
- unimported
- zero
- missing
- inline
- badfiles
- substitute
- duplicates
- importreplace
- web
- originquery
# --------------- Performance ---------------
threaded: yes
# --------------- UI ---------------
verbose: no
# --------------- Tagging ---------------
per_disc_numbering: yes
import:
log: /config/beet.log
write: yes
copy: no
move: yes
resume: yes
incremental: yes
incremental_skip_later: yes
quiet: no
quiet_fallback: skip
from_scratch: no
default_action: apply
none_rec_action: ask
duplicate_action: ask
autotag: yes
art_filename: folder
mbcollection:
auto: yes
collection: XXXX
remove: yes
musicbrainz:
user: XXXX
pass: XXXX
extra_tags:
- year
- catalognum
- country
- media
- label
zero:
fields: comments
auto: yes
keep_fields: []
update_database: no
# --------------- Import ---------------
clutter:
- Thumbs.DB
- Thumbs.db
- .DS_Store
- '**.zip'
- '**.torrent'
- '**.ini'
- '**.txt'
- '**.nfo'
- '**.m3u'
missing:
format: $albumartist - $album - $title
count: no
total: no
album: no
match:
strong_rec_thresh: 0.08
max_rec:
missing_tracks: medium
unmatched_tracks: medium
preferred:
countries:
- US
- XE
- JP
- GB|UK
media: [Digital Media|File, CD, SACD]
original_year: no
item_fields:
is_mp3_aac: 1 if format == "MP3" or format == "AAC" else 0
is_flac: 1 if format == "FLAC" else 0
disc0: disc
disctotal0: disctotal
album_fields:
title0: title
albumtypes:
types:
- ep: 'EP - '
- single: 'Single - '
- live: 'Live - '
- remix: 'Remix - '
bracket: ''
ignore_va: [compilation]
paths:
default: '%substitute{$albumartist}/($original_year) $albumartist - %ifdef{altalbum,$altalbum,$album}%ifdef{transtitle, [$transtitle]} [%ifdef{disambig,$disambig - }%if{$atypes,$atypes}${format}%if{$is_mp3_aac, - $album_bitrate}%if{$is_flac, - $max_bitdepth - $max_samplerate}]/%if{$multidisc,Disc $disc0/}${track} - %ifdef{alttitle,$alttitle,$title}'
collection::^.+: _Other/$collection/($original_year) $albumartist - %ifdef{altalbum,$altalbum,$album}%ifdef{transtitle, [$transtitle]} [%ifdef{disambig,$disambig - }${format}%if{$is_mp3_aac, - $album_bitrate}%if{$is_flac, - $max_bitdepth - $max_samplerate}]/%if{$multidisc,Disc $disc0/}${track} - %ifdef{alttitle,$alttitle,$title}
substitute:
bladee &.*: Bladee
blu &.*: Blu
bob dylan &.*: Bob Dylan
broadcast and.*: Broadcast
casiopea.*: Casiopea
czarface.*: Czarface
"death\u2019s dynamic shroud and.*": "death\u2019s dynamic shroud"
dizzy gillespie.*: Dizzy Gillespie
drake &.*: Drake
"el\u2010p feat.*": "El\u2010P"
evaboy.*: miya lowe
fred again...*: Fred again..
.*gene clark with.*: Gene Clark
gorillaz feat.*|spacemonkeyz &.*: Gorillaz
"Hiromi\u2019s Sonicbloom|\u4E0A\u539F\u3072\u308D\u307F \u30B6\u30FB\u30C8\u30EA\u30AA\u30FB\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8": Hiromi
iglooghost.*: Iglooghost
"jay\u2010z &.*": "JAY\u2010Z"
john williams.*: John Williams
jpegmafia.*: JPEGMAFIA
"kanye west.*|kids see ghosts|\\\xA5\\$": Kanye West
laufey with.*: Laufey
macroblank &.*: Macroblank
mf doom &.*|jj doom|dangerdoom|viktor vaughn|king geedorah|nehruviandoom|westsidedoom: MF DOOM
neil young &.*: Neil Young
quasimoto: Madlib
rita lee &.*: Rita Lee
round table.*: Round Table
ryusenkei.*: Ryusenkei
saint pepsi.*: SAINT PEPSI
"Stan Getz & Jo\xE3o Gilberto.*": "Stan Getz & Jo\xE3o Gilberto"
Sufjan Stevens &.*: Sufjan Stevens
thaiboy digital &.*: Thaiboy Digital
the moody blues.*: The Moody Blues
the velvet underground.*: The Velvet Underground
.*tommy heavenly.*: "Tommy february\u2076"
trent reznor & atticus ross.*: Trent Reznor & Atticus Ross
yung lean &.*: Yung Lean
^(.*?)( & Madlib| & The Alchemist).*: \1
importreplace:
replacements: [{item_fields: artist artist_credit artists artists_credit composer, album_fields: artist artist_credit artists artists_credit composer, replace: {'Ye(?!\w)': Kanye West, 'Charli xcx(?!\w)': Charli XCX, 'RYUSENKEI(?!\w)': Ryusenkei}}, {item_fields: artist_sort artists_sort composer_sort, album_fields: artist_sort artists_sort composer_sort, replace: {'Ye(?!\w)': 'West, Kanye', 'Charli xcx(?!\w)': Charli XCX, 'RYUSENKEI(?!\w)': Ryusenkei}}]
fetchart:
auto: no
cover_names: folder cover front
minwidth: 500
maxwidth: 3000
high_resolution: yes
enforce_ratio: 0.5%
sources:
- filesystem
- itunes
- amazon
- albumart
- coverart: releasegroup
deinterlace: yes
cover_format: JPEG
quality: 98
max_filesize: 0
cautious: no
store_source: no
google_key: REDACTED
google_engine: REDACTED
fanarttv_key: REDACTED
lastfm_key: REDACTED
embedart:
auto: no
maxwidth: 720
quality: 95
compare_threshold: 0
ifempty: no
remove_art_file: no
unimported:
ignore_extensions: jpg png zip jepg log cue yaml db
ignore_subdirectories: []
lastgenre:
whitelist: /config/whitelist.txt
auto: no
canonical: yes
count: 5
fallback: ''
force: yes
min_weight: 10
prefer_specific: no
source: album
title_case: yes
separator: '; '
keep_existing: no
extended_debug: no
originquery:
origin_file: origin.yaml
tag_patterns:
media: $.Media
year: $."Edition year"
label: $."Record label"
catalognum: $."Catalog number"
albumdisambig: $.Edition
web:
host: 0.0.0.0
port: 8337
cors: ''
cors_supports_credentials: no
reverse_proxy: no
include_paths: no
readonly: yes
duplicates:
album: no
checksum: ''
copy: ''
count: no
delete: no
format: ''
full: no
keys: []
merge: no
move: ''
path: no
tiebreak: {}
strict: no
tag: ''
pathfields: {}
yearfixer:
auto: no
force: no
mbsubmit:
format: $track. $title - $artist ($length)
threshold: medium
picard_path: picard
I had very similar code and I don't remember 5+ minutes to move 180 files. But it's been a while. Could also be a regression in the 7ish years it's been since I wrote my inline config.
https://gist.github.com/RollingStar/86e041338df295afbbf77a9027903068#file-beets_config-yaml-L281
If I have time I'll see if I can bisect a version to narrow it down.
Well I may have misattributed this to Inline since that just happened to make the issue less severe, but it seems more related to the path templating than the actual inline value generation.
Using a simple path template of:
paths:
default: $albumartist/$original_year - $albumartist - $track - $title
It runs in about 3 seconds:
Sun May 11 22:52:58 2025 cprofile.stats
1217609 function calls (1179922 primitive calls) in 3.679 seconds
Ordered by: cumulative time
List reduced from 4747 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
615/1 0.021 0.000 3.680 3.680 {built-in method builtins.exec}
1 0.000 0.000 3.680 3.680 /venv/bin/beet:1(<module>)
1 0.000 0.000 2.528 2.528 /root/beets/beets/ui/__init__.py:1857(main)
1 0.000 0.000 2.528 2.528 /root/beets/beets/ui/__init__.py:1778(_raw_main)
617/18 0.010 0.000 2.216 0.123 <frozen importlib._bootstrap>:1349(_find_and_load)
616/18 0.005 0.000 2.214 0.123 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
582/18 0.004 0.000 2.198 0.122 <frozen importlib._bootstrap>:911(_load_unlocked)
533/17 0.013 0.000 2.197 0.129 <frozen importlib._bootstrap_external>:993(exec_module)
1386/48 0.004 0.000 2.182 0.045 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
451/21 0.001 0.000 1.865 0.089 {built-in method builtins.__import__}
Running something slightly more advanced:
paths:
default: $albumartist/$original_year - $albumartist %ifdef{altalbum,$altalbum,$album} %ifdef{transtitle, [$transtitle] [%ifdef{disambig,$disambig - }} - $track - $title
It's about the same:
Sun May 11 22:53:47 2025 cprofile.stats
1231084 function calls (1193243 primitive calls) in 2.951 seconds
Ordered by: cumulative time
List reduced from 4742 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
615/1 0.014 0.000 2.952 2.952 {built-in method builtins.exec}
1 0.000 0.000 2.952 2.952 /venv/bin/beet:1(<module>)
1 0.000 0.000 2.308 2.308 /root/beets/beets/ui/__init__.py:1857(main)
1 0.000 0.000 2.308 2.308 /root/beets/beets/ui/__init__.py:1778(_raw_main)
617/18 0.006 0.000 1.535 0.085 <frozen importlib._bootstrap>:1349(_find_and_load)
616/18 0.004 0.000 1.533 0.085 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
582/18 0.004 0.000 1.521 0.084 <frozen importlib._bootstrap>:911(_load_unlocked)
533/17 0.011 0.000 1.519 0.089 <frozen importlib._bootstrap_external>:993(exec_module)
1352/35 0.002 0.000 1.514 0.043 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
451/21 0.001 0.000 1.321 0.063 {built-in method builtins.__import__}
But as soon as I put in one of the inline fields:
album_fields:
multidisc: 1 if disctotal > 1 else 0
paths:
default: $albumartist/$original_year - $albumartist - $track - $title - %if{$multidisc,A,B}
That's when it gets slow:
Sun May 11 23:01:30 2025 cprofile.stats
1235325 function calls (1197227 primitive calls) in 9.073 seconds
Ordered by: cumulative time
List reduced from 4743 to 20 due to restriction <20>
ncalls tottime percall cumtime percall filename:lineno(function)
615/1 0.014 0.000 9.074 9.074 {built-in method builtins.exec}
1 0.000 0.000 9.074 9.074 /venv/bin/beet:1(<module>)
1 0.000 0.000 8.389 8.389 /root/beets/beets/ui/__init__.py:1857(main)
1 0.000 0.000 8.389 8.389 /root/beets/beets/ui/__init__.py:1778(_raw_main)
1 0.000 0.000 7.358 7.358 /root/beets/beets/ui/commands.py:2207(move_func)
1 0.000 0.000 7.358 7.358 /root/beets/beets/ui/commands.py:2128(move_items)
24 0.000 0.000 7.308 0.305 /root/beets/beets/dbcore/db.py:950(query)
11 0.000 0.000 7.298 0.663 /root/beets/beets/library.py:1654(_fetch)
11 0.001 0.000 7.298 0.663 /root/beets/beets/dbcore/db.py:1211(_fetch)
24 7.290 0.304 7.290 0.304 {method 'execute' of 'sqlite3.Connection' objects}
7 0.000 0.000 7.288 1.041 /root/beets/beets/library.py:1695(items)
6 0.000 0.000 6.076 1.013 /root/beets/beets/library.py:1076(destination)
6 0.000 0.000 6.054 1.009 /root/beets/beets/dbcore/db.py:686(evaluate_template)
6 0.000 0.000 6.053 1.009 /root/beets/beets/util/functemplate.py:554(substitute)
6 0.000 0.000 6.053 1.009 /root/beets/beets/util/functemplate.py:578(wrapper_func)
30 0.000 0.000 6.051 0.202 /root/beets/beets/library.py:483(__getitem__)
30 0.000 0.000 6.051 0.202 /root/beets/beets/library.py:469(_get)
30 0.001 0.000 6.049 0.202 /root/beets/beets/dbcore/db.py:123(_get_formatted)
470/129 0.001 0.000 6.049 0.047 /root/beets/beets/dbcore/db.py:443(_get)
6 0.000 0.000 6.044 1.007 /root/beets/beetsplug/inline.py:107(_expr_func)
However if I make it an itemfield, it's fast again:
item_fields:
multidisc: 1 if disctotal > 1 else 0
paths:
default: $albumartist/$original_year - $albumartist - $track - $title - %if{$multidisc,A,B}
Sun May 11 23:07:50 2025 cprofile.stats
1237616 function calls (1199285 primitive calls) in 2.934 seconds
Ordered by: cumulative time
List reduced from 4743 to 20 due to restriction <20>
ncalls tottime percall cumtime percall filename:lineno(function)
615/1 0.014 0.000 2.935 2.935 {built-in method builtins.exec}
1 0.000 0.000 2.935 2.935 /venv/bin/beet:1(<module>)
1 0.000 0.000 2.303 2.303 /root/beets/beets/ui/__init__.py:1857(main)
1 0.000 0.000 2.303 2.303 /root/beets/beets/ui/__init__.py:1778(_raw_main)
617/18 0.006 0.000 1.400 0.078 <frozen importlib._bootstrap>:1349(_find_and_load)
616/18 0.004 0.000 1.399 0.078 <frozen importlib._bootstrap>:1304(_find_and_load_unlocked)
582/18 0.003 0.000 1.387 0.077 <frozen importlib._bootstrap>:911(_load_unlocked)
533/17 0.010 0.000 1.386 0.082 <frozen importlib._bootstrap_external>:993(exec_module)
1352/35 0.002 0.000 1.382 0.039 <frozen importlib._bootstrap>:480(_call_with_frames_removed)
1 0.000 0.000 1.324 1.324 /root/beets/beets/ui/commands.py:2207(move_func)
1 0.000 0.000 1.324 1.324 /root/beets/beets/ui/commands.py:2128(move_items)
12 0.000 0.000 1.297 0.108 /root/beets/beets/dbcore/db.py:950(query)
12 1.285 0.107 1.285 0.107 {method 'execute' of 'sqlite3.Connection' objects}
5 0.000 0.000 1.285 0.257 /root/beets/beets/library.py:1654(_fetch)
5 0.000 0.000 1.284 0.257 /root/beets/beets/dbcore/db.py:1211(_fetch)
1 0.000 0.000 1.276 1.276 /root/beets/beets/ui/commands.py:62(_do_query)
1 0.000 0.000 1.275 1.275 /root/beets/beets/library.py:1695(items)
451/21 0.001 0.000 1.188 0.057 {built-in method builtins.__import__}
1 0.000 0.000 0.976 0.976 /root/beets/beets/ui/__init__.py:1662(_setup)
1 0.000 0.000 0.768 0.768 /root/beets/beets/ui/__init__.py:1626(_load_plugins)
I know nothing about how the inline code works. But, could it be multiplying the overhead by the number of tracks in the album? Say f(item) = 1 second, f(album) = 10 * f(item) if it has 10 tracks.
My test case was using a title query that I knew only returned a few tracks, in this case 3. However, it was split across (iirc) two albums, so if I need to repro again, I'd be sure to do it on a single album to see what the call counts end up as.
Attempting to get to the root cause of this
-
Added a logging call to investigate interaction with the database.
diff --git a/beets/dbcore/db.py b/beets/dbcore/db.py index 16ca54995..44cea2323 100755 --- a/beets/dbcore/db.py +++ b/beets/dbcore/db.py @@ -33,2 +33,3 @@ import beets +from beets.logging import getLogger @@ -46,2 +47,4 @@ +log = getLogger("beets") + if TYPE_CHECKING: @@ -1221,2 +1224,3 @@ def _fetch """ + log.warning("Fetching {} with query {}", model_cls.__name__, query) query = query or TrueQuery() # A null query. -
Using my largest album that has 136 tracks:
$ beet list album:'Together with Ukraine' -f '$albumtotal' -a Fetching Item with query MatchQuery('id', 0, fast=True) Fetching Album with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)]) Fetching Item with query MatchQuery('album_id', 10583, fast=True) 136 -
Checking three sets of configurations
- Case 1: No plugins enabled
- Case 2: inline with
item_fieldsplugins: inline item_fields: has_lyrics: bool(lyrics) label_or_albumartist: | aartist = (albumartist or artist).split(", ")[0] if not label or label.lower() in {"self", "not on label", aartist.lower()}: return aartist return label or albumartist or artist singleton_track_artist: '"" if label.lower() == artist.lower() else f"{artist}_"' track_artist: '"" if album and (label.lower() == artist.lower() or albumartist == artist) else f"{artist}_"' album_name: | return "_".join((a for a in [ catalognum if catalognum != album else "", (albumartist if albumartist not in {label, "Various Artists"} else ""), album ] if a.strip())) track_identification: | if (track_alt := globals().get("track_alt")) and track_alt[0].isalpha(): idx = track_alt elif track: idx = str(track).zfill(2) else: return "" if disctotal > 1: idx = f"{disc}_{idx}" return f"{idx}_" - Case 3: inline with
item_fieldsandalbum_fieldsalbum_fields: label_or_albumartist: | aartist = (albumartist or artist).split(", ")[0] if not label or label.lower() in {"self", "not on label", aartist.lower()}: return aartist return label or albumartist or artist multiple_artists: | ', ' in albumartist or 'Various' in albumartist or (len(set(item.artist.split()[0] for item in items)) > 1)
See the results
Case 1: No plugins enabled: 1.9s
$ count "beet move -p album:'Together with Ukraine'" >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Moving 129 items.
1s 887ms 598us | 14 pids
Case 2: inline with item_fields: 2.2s
$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Moving 0 items (129 already in place).
2s 149ms 934us | 13 pids
Case 3: inline with item_fields and album_fields: 11.2s
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Moving 0 items (129 already in place).
11s 173ms 786us | 26 pids
Will suggest some improvements in the next comment.
See https://github.com/beetbox/beets/pull/5784 for a potential fix:
Case 1: No plugins enabled: 1.7s
$ count "beet move -p album:'Together with Ukraine'" >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 129 items.
1s 714ms 289us | 13 pids
Case 2: inline with item_fields: 1.9s
$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 0 items (129 already in place).
1s 890ms 130us | 16 pids
Case 3: inline with item_fields and album_fields: 2.2s
$ count beet move -p album:'Together with Ukraine' >/dev/null
Fetching Item with query MatchQuery('id', 0, fast=True)
Fetching Item with query AndQuery([SubstringQuery('album', 'Together with Ukraine', fast=True)])
Fetching Album with query MatchQuery('id', 10583, fast=True)
Fetching Item with query MatchQuery('album_id', 10583, fast=True)
Fetching Album with query AndQuery([MatchQuery('mb_albumid', 'https://togetherwithukraine.bandcamp.com/album/together-with-ukraine', fast=True)])
Moving 0 items (129 already in place).
2s 182ms 987us | 14 pids
Note this introduces issues (see failing tests) as the cache needs resetting, but I've coded this in just to start the work towards an eventual fix.
As an aside, #5809 does a lot to speed this up also without having to rework a bunch of DB caching and having to worry about cache invalidation.
root@97eca491810c:/config# time beet move -p 'artist:Charli XCX' > /dev/null
Moving 160 items.
real 0m20.456s
user 0m18.388s
sys 0m1.782s
This is with multiple albumfields.
album_fields:
album_bitrate: |
total = 0
for item in items:
total += item.bitrate
abr = round((total / len(items)) / 1000)
if abr < 480 and abr >= 320:
return '320kbps'
elif abr < 320 and abr >= 220 and abr != 256:
return 'V0'
elif abr == 256:
return '256kbps'
elif abr < 215 and abr >= 170 and abr != 192:
return 'V2'
elif abr == 192:
return '192kbps'
elif abr < 170:
return str(abr) + 'kbps'
return abr
max_samplerate: |
max = 0
for item in items:
if item.samplerate > max:
max = item.samplerate
return str(max / 1000) + " kHz"
max_bitdepth: |
max = 0
for item in items:
if item.bitdepth > max:
max = item.bitdepth
return str(max) + " bit"
multidisc: 1 if disctotal > 1 else 0
Additionally to caching, I think this could also be an problem that could benefit from creating indexes for the database joins. See #5809 for reference.
If you still have the same setup, I would love to see the results for the same benchmarks while having the following database indexes:
CREATE INDEX IF NOT EXISTS "items_album_id_idx" ON items (album_id);
CREATE INDEX IF NOT EXISTS "attrs_album_id_idx" ON album_attributes (entity_id);
CREATE INDEX IF NOT EXISTS "attrs_item_id_idx" ON item_attributes (entity_id);
Be sure to delete all indexes between benchmarks tho ;)
I've unfortunately moved data and tweaked a bunch of system things to get a reliable benchmark to compare with before.