[go: up one dir, main page]
More Web Proxy on the site http://driver.im/ skip to main content
research-article
Public Access

External-memory Dictionaries in the Affine and PDAM Models

Published: 20 September 2021 Publication History

Abstract

Storage devices have complex performance profiles, including costs to initiate IOs (e.g., seek times in hard drives), parallelism and bank conflicts (in SSDs), costs to transfer data, and firmware-internal operations.
The Disk-access Machine (DAM) model simplifies reality by assuming that storage devices transfer data in blocks of size B and that all transfers have unit cost. Despite its simplifications, the DAM model is reasonably accurate. In fact, if B is set to the half-bandwidth point, where the latency and bandwidth of the hardware are equal, then the DAM approximates the IO cost on any hardware to within a factor of 2.
Furthermore, the DAM model explains the popularity of B-trees in the 1970s and the current popularity of Bɛ-trees and log-structured merge trees. But it fails to explain why some B-trees use small nodes, whereas all Bɛ-trees use large nodes. In a DAM, all IOs, and hence all nodes, are the same size.
In this article, we show that the affine and PDAM models, which are small refinements of the DAM model, yield a surprisingly large improvement in predictability without sacrificing ease of use. We present benchmarks on a large collection of storage devices showing that the affine and PDAM models give good approximations of the performance characteristics of hard drives and SSDs, respectively.
We show that the affine model explains node-size choices in B-trees and Bɛ-trees. Furthermore, the models predict that B-trees are highly sensitive to variations in the node size, whereas Bɛ-trees are much less sensitive. These predictions are born out empirically.
Finally, we show that in both the affine and PDAM models, it pays to organize data structures to exploit varying IO size. In the affine model, Bɛ-trees can be optimized so that all operations are simultaneously optimal, even up to lower-order terms. In the PDAM model, Bɛ-trees (or B-trees) can be organized so that both sequential and concurrent workloads are handled efficiently.
We conclude that the DAM model is useful as a first cut when designing or analyzing an algorithm or data structure but the affine and PDAM models enable the algorithm designer to optimize parameter choices and fill in design details.

References

[1]
mkfs.btrfs. [n.d.]. Manual page. Retrieved from https://btrfs.wiki.kernel.org/index.php/Manpage/mkfs.btrfs.
[2]
Alok Aggarwal and Jeffrey Scott Vitter. 1988. The input/output complexity of sorting and related problems. Commun. ACM 31, 9 (Sept. 1988), 1116–1127.
[3]
Matthew Andrews, Michael A. Bender, and Lisa Zhang. 2002. New algorithms for disk scheduling. Algorithmica 32, 2 (2002), 277–301.
[4]
Lars Arge. 2002. External-memory geometric data structures. In Proceedings of the EEF Summer School on Massive Data Sets.
[5]
Lars Arge, Michael T. Goodrich, Michael Nelson, and Nodari Sitchinava. 2008. Fundamental parallel algorithms for private-cache chip multiprocessors. In Proceedings of the 20th Annual Symposium on Parallelism in Algorithms and Architectures (SPAA’08). 197–206.
[6]
Lars Arge, Michael T. Goodrich, and Nodari Sitchinava. 2010. Parallel external-memory graph algorithms. In Proceedings of the 24th IEEE International Symposium on Parallel and Distributed Processing (IPDPS’10). IEEE, 1–11.
[7]
Microsoft Azure. 2016. How to Use Batching to Improve SQL Database Application Performance. Retrieved from https://docs.microsoft.com/en-us/azure/sql-database/sql-database-use-batching-to-improve-performance.
[8]
Rudolf Bayer and Edward M. McCreight. 1972. Organization and maintenance of large ordered indexes. Acta Info. 1, 3 (Feb. 1972), 173–189.
[9]
Naama Ben-David, Guy E. Blelloch, Jeremy T. Fineman, Phillip B. Gibbons, Yan Gu, Charles McGuffey, and Julian Shun. 2016. Parallel algorithms for asymmetric read-write costs. In Proceedings of the 28th ACM on Symposium on Parallelism in Algorithms and Architectures (SPAA’16). 145–156.
[10]
Michael A. Bender, Jon Berry, Rob Johnson, Thomas M. Kroeger, Samuel McCauley, Cynthia A. Phillips, Bertrand Simon, Shikha Singh, and David Zage. 2016. Anti-persistence on persistent storage: History-independent sparse tables and dictionaries. In Proceedings of the 35th ACM Symposium on Principles of Database Systems (PODS’16). 289–302.
[11]
Michael A. Bender, Jake Christensen, Alex Conway, Martin Farach-Colton, Rob Johnson, and Meng-Tsung Tsai. 2019. Optimal ball recycling. In Proceedings of the 30th Annual ACM-SIAM Symposium on Discrete Algorithms (SODA’19). 2527–2546.
[12]
Michael A. Bender, Alex Conway, Martín Farach-Colton, William Jannen, Yizheng Jiao, Rob Johnson, Eric Knorr, Sara McAllister, Nirjhar Mukherjee, Prashant Pandey, Donald E. Porter, Jun Yuan, and Yang Zhan. 2019. Small refinements to the DAM can have big consequences for data-structure design. In Proceedings of the 31st ACM Symposium on Parallelism in Algorithms and Architectures (SPAA’19). 265–274.
[13]
Michael A. Bender, Rathish Das, Rob Johnson, Martín Farach-Colton, and William Kuszmaul. 2020. Flushing without Cascades. In Proceedings of the 31th Annual ACM-SIAM Symposium on Discrete Algorithms (SODA’20). 650–669.
[14]
Michael A. Bender, Erik Demaine, and Martin Farach-Colton. 2005. Cache-Oblivious B-Trees. Journal on Computing 35, 2 (2005), 341–358.
[15]
Michael A. Bender, Martin Farach-Colton, Jeremy T. Fineman, Yonatan R. Fogel, Bradley C. Kuszmaul, and Jelani Nelson. 2007. Cache-oblivious streaming B-trees. In Proceedings of the 19th Annual ACM Symposium on Parallel Algorithms and Architectures (SPAA’07). 81–92.
[16]
Michael A. Bender, Martin Farach-Colton, Mayank Goswami, Rob Johnson, Samuel McCauley, and Shikha Singh. 2018. Bloom filters, adaptivity, and the dictionary problem. In Proceedings to the IEEE 59th Annual Symposium on Foundations of Computer Science (FOCS’18). 182–193.
[17]
Michael A. Bender, Martin Farach-Colton, William Jannen, Rob Johnson, Bradley C. Kuszmaul, Donald E. Porter, Jun Yuan, and Yang Zhan. 2015. An introduction to B-trees and write-optimization. :login; Mag. 40, 5 (Oct. 2015), 22–28.
[18]
Michael A. Bender, Martin Farach-Colton, Rob Johnson, Russell Kraner, Bradley C. Kuszmaul, Dzejla Medjedovic, Pablo Montes, Pradeep Shetty, Richard P. Spillane, and Erez Zadok. 2012. Don’t thrash: How to cache your hash on flash. Proc. Very Large Data Bases Endow. 5, 11 (2012), 1627–1637.
[19]
Michael A. Bender, Martin Farach-Colton, Rob Johnson, Simon Mauras, Tyler Mayer, Cynthia A. Phillips, and Helen Xu. 2017. Write-optimized skip lists. In Proceedings of the 36th ACM SIGMOD-SIGACT-SIGAI Symposium on Principles of Database Systems (PODS’17). 69–78.
[20]
Michael A. Bender, Martin Farach-Colton, and Bradley Kuszmaul. 2006. Cache-oblivious string B-trees. In Proceedings of the 25th ACM SIGACT-SIGMOD-SIGART Symposium on Principles of Database Systems (PODS’06). 233–242.
[21]
Michael A. Bender, Martín Farach-Colton, and William Kuszmaul. 2019. Achieving optimal backlog in multi-processor cup games. In Proceedings of the 51st Annual ACM Symposium on the Theory of Computing (STOC’19).
[22]
Guy E. Blelloch, Jeremy T. Fineman, Phillip B. Gibbons, Yan Gu, and Julian Shun. 2016. Efficient algorithms with asymmetric read and write costs. In Proceedings of the 24th Annual European Symposium on Algorithms (ESA’16). 14:1–14:18.
[23]
Guy E. Blelloch, Phillip B. Gibbons, Yan Gu, Charles McGuffey, and Julian Shun. 2018. The parallel persistent memory model. In Proceedings of the 30th on Symposium on Parallelism in Algorithms and Architectures (SPAA’18). 247–258.
[24]
Guy E. Blelloch, Phillip B. Gibbons, and Harsha Vardhan Simhadri. 2010. Low depth cache-oblivious algorithms. In Proceedings of the 22nd Annual ACM Symposium on Parallelism in Algorithms and Architectures (SPAA’10), Friedhelm Meyer auf der Heide and Cynthia A. Phillips (Eds.). ACM, 189–199.
[25]
Gerth S. Brodal, Erik D. Demaine, Jeremy T. Fineman, John Iacono, Stefan Langerman, and J. Ian Munro. 2010. Cache-oblivious dynamic dictionaries with update/query tradeoffs. In Proceedings of the 21st Annual ACM-SIAM Symposium on Discrete Algorithms (SODA’10). 1448–1456.
[26]
Gerth S. Brodal and Rolf Fagerberg. 2003. Lower bounds for external-memory dictionaries. In Proceedings of the 14th Annual ACM-SIAM Symposium on Discrete Algorithms (SODA’03). 546–554.
[27]
Adam L. Buchsbaum, Michael H. Goldwasser, Suresh Venkatasubramanian, and Jeffery Westbrook. 2000. On external-memory graph traversal. In Proceedings of the 11th Annual ACM-SIAM Symposium on Discrete Algorithms (SODA’00). 859–860.
[28]
Mark Callaghan. 2011. Something Awesome in InnoDB—The Insert Buffer. Retrieved from https://www.facebook.com/notes/mysql-at-facebook/something-awesome-in-innodb-the-insert-buffer/492969385932/.
[29]
Mustafa Canim, Christian A. Lang, George A. Mihaila, and Kenneth A. Ross. 2010. Buffered Bloom filters on solid state storage. In Proceedings of the International Workshop on Accelerating Data Management Systems Using Modern Processor and Storage Architectures (ADMS’10).
[30]
Feng Chen, Binbing Hou, and Rubao Lee. 2016. Internal parallelism of flash memory-based solid-state drives. Trans. Stor. 12, 3, Article 13 (May 2016), 39 pages.
[31]
Shimin Chen, Phillip B. Gibbons, Todd C. Mowry, and Gary Valentin. 2002. Fractal prefetching B-Trees: Optimizing both cache and disk performance. In Proceedings of the ACM SIGMOD International Conference on Management of Data. 157–168.
[32]
Rezaul Alam Chowdhury, Vijaya Ramachandran, Francesco Silvestri, and Brandon Blakeley. 2013. Oblivious algorithms for multicores and networks of processors. J. Parallel Distrib. Comput. 73, 7 (2013), 911–925.
[33]
Douglas Comer. 1979. The Ubiquitous B-Tree. ACM Comput. Surv. 11, 2 (June 1979), 121–137.
[34]
Alexander Conway, Ainesh Bakshi, Yizheng Jiao, William Jannen, Yang Zhan, Jun Yuan, Michael A. Bender, Rob Johnson, Bradley C. Kuszmaul, Donald E. Porter, and Martin Farach-Colton. 2017. File systems fated for senescence? Nonsense, says science! In Proceedings of the 15th USENIX Conference on File and Storage Technologies (FAST’17). 45–58.
[35]
Alex Conway, Ainesh Bakshi, Yizheng Jiao, Yang Zhan, Michael A. Bender, William Jannen, Rob Johnson, Bradley C. Kuszmaul, Donald E. Porter, Jun Yuan, and Martin Farach-Colton. 2017. How to fragment your file system. login: 42, 2 (2017). Retrieved from https://www.usenix.org/publications/login/summer2017/conway.
[36]
Alexander Conway, Martin Farach-Colton, and Philip Shilane. 2018. Optimal hashing in external memory. In Proceedings of the 45th International Colloquium on Automata, Languages and Programming (ICALP’18). 39:1–39:14.
[37]
Alex Conway, Eric Knorr, Yizheng Jiao, Michael A. Bender, William Jannen, Rob Johnson, Donald E. Porter, and Martin Farach-Colton. 2019. Filesystem aging: It’s more usage than fullness. In Proceedings of the 11th USENIX Workshop on Hot Topics in Storage and File Systems (HotStorage’19).
[38]
Peter Desnoyers. 2013. What systems researchers need to know about NAND flash. In Proceedings of the 5th USENIX Workshop on Hot Topics in Storage and File Systems (HotStorage’13).
[39]
John Esmet, Michael A. Bender, Martin Farach-Colton, and Bradley C. Kuszmaul. 2012. The TokuFS streaming file system. In Proceedings of the 4th USENIX Conference on Hot Topics in Storage and File Systems (HotStorage’12). 14.
[40]
Matteo Frigo, Charles E. Leiserson, Harald Prokop, and Sridhar Ramachandran. 2012. Cache-oblivious algorithms. ACM Trans. Algor. 8, 1 (2012), 4.
[41]
Pedram Ghodsnia, Ivan T. Bowman, and Anisoara Nica. 2014. Parallel I/O aware query optimization. In Proceedings of the ACM SIGMOD International Conference on Management of Data. 349–360.
[42]
Google, Inc.[n.d.]. LevelDB: A Fast and Lightweight Key/value Database Library By Google. Retrieved from https://github.com/google/leveldb.
[43]
Jun He, Sudarsun Kannan, Andrea C. Arpaci-Dusseau, and Remzi H. Arpaci-Dusseau. 2017. The unwritten contract of solid state drives. In Proceedings of the 12th European Conference on Computer Systems (EuroSys’17). 127–144.
[44]
IBM. 2017. Buffered Inserts in Partitioned Database Environments. Retrieved from https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.embed.doc/doc/c0061906.html.
[45]
IBM Informix. [n.d.]. Understanding SQL Insert Cursors. Retrieved from https://www.ibm.com/support/knowledgecenter/en/SSBJG3_2.5.0/com.ibm.gen_busug.doc/c_fgl_InsertCursors_002.htm.
[46]
Riko Jacob and Nodari Sitchinava. 2017. Lower bounds in the asymmetric external-memory model. In Proceedings of the 29th ACM Symposium on Parallelism in Algorithms and Architectures (SPAA’17). 247–254.
[47]
William Jannen, Jun Yuan, Yang Zhan, Amogh Akshintala, John Esmet, Yizheng Jiao, Ankur Mittal, Prashant Pandey, Phaneendra Reddy, Leif Walsh, Michael A. Bender, Martin Farach-Colton, Rob Johnson, Bradley C. Kuszmaul, and Donald E. Porter. 2015. BetrFS: A right-optimized write-optimized file system. In Proceedings of the 13th USENIX Conference on File and Storage Technologies (FAST’15). 301–315.
[48]
Chris Jermaine, Anindya Datta, and Edward Omiecinski. 1999. A novel index supporting high volume data warehouse insertion. In Proceedings of 25th International Conference on Very Large Data Bases (VLDB’99). 235–246. Retrieved from http://www.vldb.org/conf/1999/P23.pdf.
[49]
Bradley C. Kuszmaul. 2009. How fractal trees work. In Proceedings of the OpenSQL Camp.
[50]
Amanda McPherson. [n.d.]. A Conversation with Chris Mason on Btrfs: The Next Generation File System for Linux. Retrieved from https://www.linuxfoundation.org/blog/2009/06/a-conversation-with-chris-mason-on-btrfs/.
[51]
MySQL 5.7 Reference Manual. [n.d.]. Chapter 15 The InnoDB Storage Engine. Retrieved from http://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html.
[52]
NuDB. 2016. NuDB: A Fast Key/value Insert-only Database for SSD Drives in C++11. Retrieved from https://github.com/vinniefalco/NuDB.
[53]
Patrick O’Neil, Edward Cheng, Dieter Gawlic, and Elizabeth O’Neil. 1996. The log-structured merge-tree (LSM-tree). Acta Info. 33, 4 (1996), 351–385.
[54]
Oracle. 2017. Tuning the Database Buffer Cache. Retrieved from https://docs.oracle.com/database/121/TGDBA/tune_buffer_cache.htm.
[55]
Oracle Corporation. [n.d.]. MySQL 5.5 Reference Manual. Retrieved from https://dev.mysql.com/doc/refman/5.5/en/innodb-file-space.html.
[56]
Oracle Corporation.2015. Oracle BerkeleyDB Reference Guide. Retrieved from http://sepp.oetiker.ch/subversion-1.5.4-rp/ref/am_conf/pagesize.html.
[57]
Oracle Corporation. 2016. Setting Up Your Data Warehouse System. Retrieved from https://docs.oracle.com/cd/B28359_01/server.111/b28314/tdpdw_system.htm.
[58]
Anastasios Papagiannis, Giorgos Saloustros, Pilar González-Férez, and Angelos Bilas. 2016. Tucana: Design and implementation of a fast and efficient scale-up key-value store. In Proceedings of the USENIX Annual Technical Conference (USENIX ATC’16). 537–550.
[59]
John Paul. [n.d.]. Teradata Thoughts. Retrieved from http://teradata-thoughts.blogspot.com/2013/10/teradata-13-vs-teradata-14_20.html.
[60]
Harald Prokop. 1999. Cache-Oblivious Algorithms. Master’s thesis. Department of Electrical Engineering and Computer Science, Massachusetts Institute of Technology.
[61]
Pandian Raju, Rohan Kadekodi, Vijay Chidambaram, and Ittai Abraham. 2017. PebblesDB: Building key-value stores using fragmented log-structured merge trees. In Proceedings of the 26th Symposium on Operating Systems Principles (SOSP’17). 497–514.
[62]
Mendel Rosenblum and John K. Ousterhout. 1992. The design and implementation of a log-structured file system. ACM Trans. Comput. Syst. 10, 1 (Feb. 1992), 26–52.
[63]
C. Ruemmler and J. Wilkes. 1994. An introduction to disk drive modeling. IEEE Computer 27, 3 (1994), 17–29.
[64]
SAP. 2017. RLV Data Store for Write-Optimized Storage. Retrieved from http://help-legacy.sap.com/saphelp_iq1611_iqnfs/helpdata/en/a3/13783784f21015bf03c9b06ad16fc0/content.htm.
[65]
Keith A. Smith and Margo I. Seltzer. 1997. File system aging—Increasing the relevance of file system benchmarks. In Measurement and Modeling of Computer Systems. 203–213.
[66]
SNIA. 2018. Solid State Storage (SSS) Performance Test Specification (PTS). Retrieved from https://www.snia.org/sites/default/files/technical_work/PTS/SSS_PTS_2.0.1.pdf.
[67]
TokuDB. [n.d.]. https://github.com/percona/PerconaFT, Last Accessed Sep. 24 2018.
[68]
Tokutek, Inc.[n.d.]. TokuMX—MongoDB Performance Engine. Retrieved from https://www.percona.com/software/mongo-database/percona-tokumx.
[69]
Tokutek, Inc.2013. TokuDB: MySQL Performance, MariaDB Performance. Retrieved from http://www.tokutek.com/products/tokudb-for-mysql/.
[70]
Vertica. 2017. WOS (Write Optimized Store). Retrieved from https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/Glossary/WOSWriteOptimizedStore.htm.
[71]
Jeffrey Scott Vitter. 2001. External-memory algorithms and data structures: Dealing with massive data. ACM Comput. Surveys 33, 2 (2001), 209–271.
[72]
Jeffrey Scott Vitter and Elizabeth A. M. Shriver. 1994. Algorithms for parallel memory, I: Two-level memories. Algorithmica 12, 2-3 (1994), 110–147.
[73]
Jeffrey Scott Vitter and Elizabeth A. M. Shriver. 1994. Algorithms for parallel memory, II: Hierarchical multilevel memories. Algorithmica 12, 2–3 (1994), 148–169.
[74]
James Christopher Wyllie. 1979. The Complexity of Parallel Computations. Ph.D. Dissertation. Ithaca, NY. AAI8004008.
[75]
Jimmy Xiang. 2012. Apache HBase Write Path. Retrieved from http://blog.cloudera.com/blog/2012/06/hbase-write-path/.
[76]
Jun Yuan, Yang Zhan, William Jannen, Prashant Pandey, Amogh Akshintala, Kanchan Chandnani, Pooja Deo, Zardosht Kasheff, Leif Walsh, Michael A. Bender, Martin Farach-Colton, Rob Johnson, Bradley C. Kuszmaul, and Donald E. Porter. 2016. Optimizing every operation in a write-optimized file system. In Proceedings of the 14th USENIX Conference on File and Storage Technologies (FAST’16). 1–14.
[77]
Jun Yuan, Yang Zhan, William Jannen, Prashant Pandey, Amogh Akshintala, Kanchan Chandnani, Pooja Deo, Zardosht Kasheff, Leif Walsh, Michael A. Bender, Martin Farach-Colton, Rob Johnson, Bradley C. Kuszmaul, and Donald E. Porter. 2017. Writes wrought right, and other adventures in file system optimization. Trans. Stor. 13, 1 (2017), 3:1–3:26.
[78]
Yang Zhan, Alexander Conway, Yizheng Jiao, Eric Knorr, Michael A. Bender, Martin Farach-Colton, William Jannen, Rob Johnson, Donald E. Porter, and Jun Yuan. 2018. The full path to full-path indexing. In Proceedings of the 16th USENIX Conference on File and Storage Technologies (FAST’18). 123–138.

Cited By

View all
  • (2024)Beyond Bloom: A Tutorial on Future Feature-Rich FiltersCompanion of the 2024 International Conference on Management of Data10.1145/3626246.3654681(636-644)Online publication date: 9-Jun-2024
  • (2024)Brief Announcement: Root-to-Leaf Scheduling in Write-Optimized TreesProceedings of the 36th ACM Symposium on Parallelism in Algorithms and Architectures10.1145/3626183.3660514(475-477)Online publication date: 17-Jun-2024
  • (2023)BP-Tree: Overcoming the Point-Range Operation Tradeoff for In-Memory B-TreesProceedings of the VLDB Endowment10.14778/3611479.361150216:11(2976-2989)Online publication date: 1-Jul-2023
  • Show More Cited By

Recommendations

Comments

Please enable JavaScript to view thecomments powered by Disqus.

Information & Contributors

Information

Published In

cover image ACM Transactions on Parallel Computing
ACM Transactions on Parallel Computing  Volume 8, Issue 3
September 2021
111 pages
ISSN:2329-4949
EISSN:2329-4957
DOI:10.1145/3481691
Issue’s Table of Contents
Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than ACM must be honored. Abstracting with credit is permitted. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from [email protected].

Publisher

Association for Computing Machinery

New York, NY, United States

Publication History

Published: 20 September 2021
Accepted: 01 February 2021
Revised: 01 October 2020
Received: 01 January 2020
Published in TOPC Volume 8, Issue 3

Permissions

Request permissions for this article.

Check for updates

Author Tags

  1. External memory
  2. performance models
  3. write optimization

Qualifiers

  • Research-article
  • Refereed

Funding Sources

  • NSF
  • Sandia National Laboratories
  • VMware
  • Netapp Faculty Fellowship

Contributors

Other Metrics

Bibliometrics & Citations

Bibliometrics

Article Metrics

  • Downloads (Last 12 months)188
  • Downloads (Last 6 weeks)18
Reflects downloads up to 05 Jan 2025

Other Metrics

Citations

Cited By

View all
  • (2024)Beyond Bloom: A Tutorial on Future Feature-Rich FiltersCompanion of the 2024 International Conference on Management of Data10.1145/3626246.3654681(636-644)Online publication date: 9-Jun-2024
  • (2024)Brief Announcement: Root-to-Leaf Scheduling in Write-Optimized TreesProceedings of the 36th ACM Symposium on Parallelism in Algorithms and Architectures10.1145/3626183.3660514(475-477)Online publication date: 17-Jun-2024
  • (2023)BP-Tree: Overcoming the Point-Range Operation Tradeoff for In-Memory B-TreesProceedings of the VLDB Endowment10.14778/3611479.361150216:11(2976-2989)Online publication date: 1-Jul-2023
  • (2022)Memory management optimization strategy in Spark framework based on less contentionThe Journal of Supercomputing10.1007/s11227-022-04663-579:2(1504-1525)Online publication date: 27-Jul-2022

View Options

View options

PDF

View or Download as a PDF file.

PDF

eReader

View online with eReader.

eReader

HTML Format

View this article in HTML Format.

HTML Format

Login options

Full Access

Media

Figures

Other

Tables

Share

Share

Share this Publication link

Share on social media