From c95b02bd7e0c2f2dee8f2fb1275a36416cdcc768 Mon Sep 17 00:00:00 2001 From: Nicholas Novak <34256932+NickyBoy89@users.noreply.github.com> Date: Wed, 13 Dec 2023 23:54:33 -0800 Subject: [PATCH] feat: Added start of paper to comps --- paper/block-search.drawio.png | Bin 0 -> 22268 bytes paper/document.tex | 542 ++++++++++++++++++++++++++++++++++ paper/oxycomps.sty | 102 +++++++ paper/references.bib | 307 +++++++++++++++++++ 4 files changed, 951 insertions(+) create mode 100644 paper/block-search.drawio.png create mode 100644 paper/document.tex create mode 100644 paper/oxycomps.sty create mode 100644 paper/references.bib diff --git a/paper/block-search.drawio.png b/paper/block-search.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..41bd60afe1b5ad833dfb4a4c4c0c97c9799fbf1f GIT binary patch literal 22268 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 z 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 literal 0 HcmV?d00001 diff --git a/paper/document.tex b/paper/document.tex new file mode 100644 index 0000000..2e15f5c --- /dev/null +++ b/paper/document.tex @@ -0,0 +1,542 @@ +\documentclass[10pt,twocolumn]{article} + +\usepackage{oxycomps} +\bibliography{references} + +\pdfinfo{ + /Title (SpatialDB: A Database for Storing Dense Three-Dimensional Voxel Structures) + /Author (Nicholas Novak) +} + +\title{SpatialDB: A Database for Storing Dense Three-Dimensional Voxel Structures} +\author{Nicholas Novak} +\affiliation{Occidental College} +\email{nnovak@oxy.edu} + +\begin{document} + +\maketitle + +\section{Introduction and Problem Context} + +% What my project is +In my senior comprehensive project, I have designed and implemented a database +application that is designed specifically to store complex shapes in ``voxels'', +or three-dimensional pixels. + +% Applications of voxels +A voxel\cite{enwiki:1186283262} represents a single point or cube in a +three-dimensional grid, at a variable size. This feature allows them to +approximately model many three-dimensional structures, in order to reduce the +computational complexity in analyzing the shape, which has led to many +data-related use cases outside of computer science. For example, to model the +inner workings of the brain, Neuroscientists track oxygen concentration through +neural tissue on a voxel grid as part of fMRI studies\cite{norman2006beyond}, +and Movie studios such as DreamWorks use voxel data structures to model light +reflections for visual effects\cite{museth2013vdb}. The output of MRI scans in +hospitals are very high-resolution voxel grids. Most recently, machine learning +models are being trained on the LIDAR data from self-driving +cars\cite{li2020deep} in order to better process their environments. However, +voxels are not often thought of as a way to store three-dimensional shapes, and +existing research focuses mainly on efficiently representing and processing +shapes. My approach models this problem of voxel storage and representation, and +turns it into a problem of database design. + +\subsection{Using Minecraft as a Model for a Database} + +% The problems with Minecraft +Minecraft\footnote{https://www.minecraft.net/en-us}, released 2009, is a sandbox +game that is played in a world entirely composed of cubic voxels, where the +player has complete freedom to manipulate the world by building, destroying, or +exploring any part of it. I am focusing this database on the requirements of +Minecraft because the game involves some additional challenges that traditional +databases do not consider. Primarily, the world of Minecraft is infinite in the +horizontal $x$ and $z$ axes, but fixed in the $y$ axis, which limits the amount +of information that can be stored by the database at once. The world also +contains a denser voxel grid than in many other applications, meaning that far +more of the blocks in the world are filled than empty. + +A game is also a real-time application, which means that any performance issues +will be immediately be present to the user. Most databases can be evaluated on +only their speed, but as the Minecraft server processes new information 20 times +per second, the game has a time budget of 50ms to handle all game logic, +including the storing of data. Less time processing the data in the world means +that more time will be freed up for the game to process other work, although +finishing work earlier will not necessarily be faster for the end user, if it +still under the budget of 50ms. Most databases do not meet this requirement, and +even though they may be faster, their complexity does not mean that they will +always finish operations within this time limit. + +These limitations also make Minecraft unable to take advantage of a cache, since +the number of different operations that can be done on the world is infinitely +large, remembering any previous operations will often not be helpful for the +system's performance. Minecraft also provides a good benchmark for the database, +because the unpredictability of players stresses the system's ability to return +results in a variety of settings. + +\section{Technical Background} + +\subsection{What is a database?} +When I refer to the concept of a database, I am referencing a program that sits +more or less as a ``black box'' between the user and a software application, +storing any data required for the application. In most existing applications, +this is done by a category of databases called ``relational databases'', which +offer a very general-purpose way to store user data that is highly connected. +For instance, a person stored in a relational database would be efficiently +linked to with any of their associated information, such as name or age. + +% The model of a database +In database terms, any amount of data added to the database is called a +``write'', data retrieved from the database is called a ``read'', and any +questions asked, such as ``how many people have done this'', are called +``queries''. Developers ask these questions through computer languages, one such +example being Structured Query Language or SQL, which allow +the database to be queried efficiently. + +\subsection{Challenges With Existing Databases} + +% Software development and SQL +Most software engineering projects start with a simple front-end and back-end, +typically implemented with some sort of Model-View-Controller architecture, and +connected to a relational SQL database \cite{sqliteOnlyDatabase}. This idea was +popularized by frameworks such as Ruby on Rails and Django, where the model was +most often modeled by structures within the database. This framework allowed +software developers to not have to worry about inner workings of the database, +and focus on writing business logic. This is how many start-ups were built, such +as GitHub \cite{githubSingleSQL}, who recently moved off its single SQL database +after 13 years, citing performance issues. + +% Challenges with working with SQL: Performance +Using a single SQL-speaking database can be a significant advantage development +speed, but the database can have some issues keeping up with the demands of the +application as the performance requirements expand. +% Caching +As soon as this happens, companies typically put smaller caching applications in +front of their database, such as \verb|Redis|\footnote{https://redis.io/}, +\verb|memcached|\cite{nishtala2013scaling}, or \verb|TAO| \cite{bronson2013tao}, +to allow the application to remember some of the commonly asked questions and +reduce load on the database by not having to do the same work again. + +\subsubsection{The Complexity of General-Purpose Databases} +% What is being done about this +Modern SQL databases are also very complex. Three of the most popular SQL +databases, PostreSQL, MySQL and Sqlite have 1.4 million lines +\footnote{https://wiki.postgresql.org/wiki/GSoC\_2018, in reference to the +text ``PostgreSQL is over 1.3M lines of code and some of the code paths can be +tricky to reach.''} of code, 2.9 million lines +\footnote{https://www.openhub.net/p/mysql}, and 150,000 lines +\footnote{https://www.sqlite.org/testing.html} respectively. + +% Why are databases inefficient? +Why are databases so complex? Most of the reason for the complexity is that +because these database systems so general-purpose, they cannot assume anything +about the data stored in them. For the database, finding an efficient plan to +answer each query is a known NP-hard problem\cite{chatterji2002complexity}, and +to keep itself fast, the database must construct this plan with a complex set of +approximations, based on the assumptions that it can make, which leads to +ever-evolving complexity. + +% Impossible to maintain +With this complexity, it is impossible for a single person to understand the +complete inner workings of a database. Thus, the problem of the company's +database often becomes a dedicated person in companies that can afford it, or +become entire teams of engineers at larger organizations such as +Google\cite{googlePerfTeam}. + +% Intro to special-purpose databases +What happens in the larger companies that can afford more engineering time, and +have a specific problem that they cannot solve with a traditional database? +Typically, this leads to the creation of special-purpose database solutions. For +instance, the global scale of iCloud and Apple's cloud solutions required them +to create FoundationDB\cite{zhou2021foundationdb}. A different set of challenges +in the Facebook inbox led to the creation of Apache +Cassandra\cite{lakshman2010cassandra}, which is optimized to allow for many +emails to be received, at the expense of search speed, which is done far less +frequently. + +\subsubsection{The Special-Purpose Database} + +Limiting a database's design to a specific use-case can make the development +process much simpler, to the point where it can be done by a single person, and +can offer higher performance. The first question that needs to be asked is +whether the application is \textit{write-heavy} or \textit{read-heavy}. +Read-heavy applications occur often in web development, and most social media +platforms have far more users reading the content, than writing new content for +the platform. In contrast, write-heavy applications are often seen in analytics +workloads, where data is written from many sources, and analyzed infrequently by +users. + +My application has a relatively even write and read balance, and I evaluated +three different storage data structures before choosing to implement my own + +% Special-purpose databases +Recently, companies such as Tigerbeetle\cite{tigerbeetleDesign} have taken this +domain-driven approach to database design even further, while designing a +database from the ground up to do financial accounting, which outperforms a +reference MySQL implementation at 76 accounting transactions per second, to +1,757 transactions per second \cite{tigerbeetlePerf}. This highly specialized +and domain-specific approach to creating databases is what my project is going +to be based on, to create a database around the challenges that the game +Minecraft has. + +\subsubsection{Key-Value Databases} + +One of the main architectures that I considered for my project is a design +called a key-value store\cite{kvdatabase}, which would store the relationship of +a single voxel to its value. Many other voxel databases use this method to +achieve constant-time operations on retrieving points, which means that +regardless of the size of the dataset, the database will always be able to +return a result in the same amount of time. This structures is behind many of +the high-performance caches that are commonly used to speed up web applications, +such as Redis and RocksDB\cite{dong2021rocksdb}. In order to provide high speeds +for this data, the key-value mappings are usually stored in main memory, which +is far more expensive and limited than the system's disk drive, but offers +a speed advantage of several orders of magnitude\cite{latencyKnow}. + +\section{Prior Work} + +\subsection{Voxels for Efficient Computation} + +Most existing literature on the topic of using voxels to store shapes focuses on +the application of the voxel grid for efficient computation. Since voxel points +are completely independent of each other, this allows for efficient parallel +processors, which are increasingly more common on consumer hardware, to take +advantage of this speedup. In VDB\cite{museth2013vdb} Museth demonstrates that +by modeling a sparse voxel grid in different resolutions, a computer cluster can +efficiently approximate a physical structures such as a cloud, in order to +calculate expensive lighting operations. + +\subsection{Parallel Processing on Voxel Databases} + +Williams\cite{williams1992voxel} expands upon the uses of a voxel database to +model graph and mesh-based problems. Taking advantage of the parallelism in the +grid, many problems can be reframed in the representation of voxels, and solve +those problems far more efficiently. This model however, assumes that every +voxel is stored in shared memory, making this process only viable to solve +problems that can be modeled on one machine, and are far more computationally +expensive, rather than data-intensive. + +\subsection{Large Voxel Data Set Processing} + +Another approach to the problem of storing voxel data is the distributed +approach in Gorte et. al. \cite{gorte2023analysis}. Since memory is limited +within one computer, this workload can be split up between many servers, which +allows very large datasets to be worked on by a single workstation through an +API. This method keeps many of the same performance considerations, but also +assumes that the voxel data is not very dense, and uses a three-dimensional +data structure called an octree, which allows the user to change the resolution +of the data that they are working on. In the paper, Gorte acknowledges the need +to split large datasets up into smaller regions, which is similar to the concept +of ``chunks'' in my implementation. + +\subsection{Previous Special-Purpose Databases} + +The design of my database was also inspired by the LSM tree and data-driven +designs of Tigerbeetle\cite{tigerbeetleDesign}, which is also able to handle +concurrent operations on the same design. Another database, +CockroachDB\footnote{https://www.cockroachlabs.com/product/}, uses a key-value +mapping backend to store a SQL-like tables and rows. Finally, the design of +caching layers in modern SQL caches such as Noria\cite{gjengset2018noria} show +that it it possible to efficiently remember the complex queries found in SQL, +and replicate these in real-time. + +\section{Methods} + +Almost every part of the database was designed so that most operations could be +done in constant time. + +The database provides a simple interface to read and write data, consisting of +the following: +\begin{itemize} + \item Read a single block + \item Write a single block + \item Change a range of blocks + \item Read a pre-defined ``chunk'' of blocks +\end{itemize} + + +The process of fetching the data for a single point in the world starts at that +point's $x, y$ and $z$ location. The world is infinite in size on the horizontal +$x$ and $z$ axes, but limited in the vertical $y$ axis. In my database, the +world is composed of an infinite grid of ``chunks'', or columns that are a fixed +16 x 16 blocks in the $x$ and $z$ axes, but 256 blocks in the vertical $y$ axis. + +Once you know a point's location, you can find with a modulus what chunk the +point is located within. From there, the database only needs to retrieve the +data for the chunk stored at that location. + +Initial implementations for my database focused on tree-based approaches for +finding the files for chunks, but with their complexity and non-constant +complexity, I decided to store each chunk separately. However, with worlds with +chunk counts in the hundreds of thousands, the filesystem implementations had +issues with searching through so many files, which led to performance problems. +Finally, I settled on merging all the chunk data into one file, and use the +filesystem's \verb|seek| syscall to lookup the offset for the correct chunk. A +simple hash table was then used to store each chunk's location with its offset +in the file, which keeps the memory cost low, even with chunk counts in the +millions. This allows for constant-time searches for the chunk's data. + +Once a chunk is retrieved from disk, the format of the chunk is broken down into +smaller cubic slices of the chunk, called ``sections'' each section is a +16x16x16 cubic area that keeps an index for every chunk. The point's $y$ +position tells the database what section the point is in, and a simple formula +is done to convert the remaining $x$ and $z$ axes into an index within the +section. + +Every section additionally stores a look-up-table, that stores a mapping of a +\textit{palette index} to the state of a block. When the value for the point is +retrieved from the section, the value returned is not the block's state, but +simply an index into this palette. The palette lookup is done in constant time, +and when a new block is added into the section that needs an additional state in +the palette, this value is added in constant time as well. The existence of this +palette supports the efficient operation of another part of the database, which +is the ability to change large portions of blocks in the world. + +Once the value of the point is found in the palette, the value can be returned +to the user. A visual diagram of this process can be found in figure +\ref{fig:lookup}. + +\begin{figure} + \centering + \includegraphics[width=8cm]{block-search.drawio.png} + \caption{The process of looking up a single block} + \label{fig:lookup} +\end{figure} + +The ability to change a region of blocks is also a common operation within the +database, and which isn't locked to a specific range of chunks. This operation +is implemented as overwriting the palettes for a specific region. By overwriting +every palette index to the same value, every value in the chunk effectively gets +set to the same value. This does however create the need for an additional +``compaction'' step, where the palette is shrunk to remove duplicate values, and +every block within the section must be updated to point to the correct index in +the palette. This compaction is done upon any subsequent writes to the section +by inserting a block, because only this fixed-size section needs to be changed, +preserving the time of the operation as constant time. + +Finally, the retrieval of a single chunk can be done efficiently, because the +database already stores chunks separately, and serializes these to the client. + +% \cite{vohra2016apache}. + +\section{Evaluation Metrics} + +\subsection{Reading Single Voxels} + +Reads and writes of single voxels are the most common fundamental operation for +my database, and the database should be handle this operation in the same amount +of time, regardless of the size of the world. Both my implementation and the +simpler key-value store meet this criteria. + +\subsection{Changing Regions of Voxels} + +Changing regions of voxels should be able to be done in linear time. This is +because resetting or changing a region of voxels is important while drawing +shapes of various resolutions. Lower resolution shapes are less precise, and +thus are able to be written faster. + +\subsection{Memory Requirements} + +The memory requirement is set quite low, at 256MB, in order to require the +database to store most of its data on disk, and limit its memory usage to +important caching features. This limitation was chosen for larger datasets that +don't fit within memory on a single machine, because memory is much more +expensive than disk storage, and would limit the analysis to smaller voxel grids. + +\subsection{Reading Regions of Voxels} + +The ability to retrieve large shapes from the database is important, because in +order to export a shape, another operation must be present to efficiently do +this. This operation therefore must be done in constant time, because as +Gorte\cite{gorte2023analysis} identifies, many researchers might want to work +on the same dataset, and exporting all this data would become inefficient for +the database to process. In the use-case of Minecraft, this allows the server to +support many more players at once, by not sending every individual block to each +client. This requirement is not met by the key-value database, but is reached by +my implementation, by sending the stored chunks on disk. + +\subsection{Reading Neighboring Blocks} + +The last common operation in most voxel databases is the ability to read points +that are neighboring another point. This is important because many voxel shapes +approximate cubic shapes \cite{gorte2023analysis}, and in Minecraft, players are +constantly affecting voxels that are nearer to each other. + +\section{Results and Discussion} + +Benchmarking on my laptop, inserting values in various spreads around the voxel +world, I get the following benchmarks, comparing an in-memory implementation of +SpatialDB, the disk-based implementation of SpatialDB, and a memory-based +key-value implementation in figure \ref{fig:reads}: + +\begin{figure} + \centering + \begin{tabular}{c | c | c | c} + Spread of Points & In-memory & Disk & KeyValue\\ + \hline + 128 & 4275 & 4146669 & 176.7\\ + 512 & 4184 & 3319162 & 190.6\\ + 2048 & 2613 & 422938 & 184.8\\ + 65536 & 2382 & 18814 & 186.1 + \end{tabular} + \caption{Time (in ns) to operate on a single voxel, based on the size of the + world (spread)} + \label{fig:reads} +\end{figure} + +These results show that the scaling remains consistent between the in-memory +version and the key-value store, although my implementation is about two orders +of magnitude slower than the latter. This scaling is however not met by the +performance of the on-disk database. Originally, I thought that these poor +results were the result of no caching being done on the chunk files, which would +have made searches much slower, but still doesn't explain the improvement in +performance by larger worlds. This led me to implement a disk cache, which had +similar results, to the final implementation where I combined all the data in +one large file, and selectively read sections from that file. This leads me to +believe that as the points tested grow more spread out, since the world is only +so large, many points will be outside of the loaded chunks, and instantly return +empty. + +This change could likely be addressed by a change in caching methods, and +remembering the data for more chunks, but this still doesn't address the slow +speeds for accessing data in the first place. The slow speeds are most likely +the decoding of the JSON data stored on disk, which is relatively large at +about 4 megabytes in size. A custom encoding method could be designed to replace +this scheme, or additionally pre-allocate the entire storage space in the +chunks, so that chunk data could be retrieved without decoding the entire chunk. +However, this would require a much more constrained data layout, and limit the +implementation of different voxels. + +Additionally, compression + +\section{Ethical Considerations} + +\subsection{Considerations of Computing Resources} + +Since databases are at the core part of most complex systems, they are often +built to be run on hardware that the normal consumer can afford +\footnote{\url{https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ntdbi/oracle-database-minimum-hardware-requirements.html}} +\footnote{\url{https://wiki.lustre.org/Lustre_Server_Requirements_Guidelines}}. + +The large hardware requirements of these databases come from the environments +where they are implemented, and at many of these companies, the ability to +keep buying faster hardware allows the company to work on other things that are +more important. However, what this does to the player is effectively prices them +out of the game that they would be already playing, especially since the +database would also have to run alongside the existing Java application of +Minecraft, which quickly exhaust system memory. + +In the design of my server I have to prioritize both performance to take +advantage of the existing hardware, but make sure that the accessibility for +the application does not decrease as a result. + +\subsection{Considerations of Complexity} +Another factor to consider in the implementation of my database is how complex +the existing systems are. Some of the most popular SQL databases, PostgreSQL and +MySQL have 1.4 and 4.4 million lines of code respectively +\footnote{\url{https://news.ycombinator.com/item?id=24813239}}. + +With so much complexity going on, this significantly decreases the overall +knowledge of the system, as well as the individual user who has to debug their +game. Most of this is from the large amount of query logic that handles caching +and speeding up certain queries, so knowing more about the specific problem that +I am trying to solve removes this process from having to be done. + +Especially since most of the people in the Minecraft community are volunteers in +the open-source community, debugging this large of an application would be out of +scope for enjoying a game, and likely lead to it being replaced with something +more simple. The reliability characteristics are also less than what are +required for Minecraft, since they are being compared against a single-threaded +Java program which has been tested to do the correct thing. + +\subsection{Considerations in Security} + +Since these databases are very complex, there is also the risk that having a +server exposed over the internet through the Minecraft game server might leave +it exposed to attacks. While this is a large issue, an even more important +implication is the ability to configure the database correctly. Since these +databases are extremely complex, it is also very hard to make sure that they are +configured securely. There have been many high-profile data +breaches\footnote{\url{https://www.zdnet.com/article/hacker-ransoms-23k-mongodb-databases-and-threatens-to-contact-gdpr-authorities/}} +that involve a single server, even at larger companies that have dedicated teams +that involve a data breach. + +My plan to mitigate this risk is to implement the database in a memory-safe +programming language, which should remove the risk class of memory-unsafety +bugs, which account for around 70\% of all bugs in the Chromium browser +engine\footnote{\url{https://www.chromium.org/Home/chromium-security/memory-safety/}}, +which is entirely written in non-memory safe C++. + +And if the database information is ever able to be leaked through the Minecraft +protocol, the attacker would have access to the full data, because I am planning +to store it unencrypted for performance reasons, and rely on the encryption of +the Minecraft client. And, the data involved does not involve personally +identifying information, so the usefulness of the data would be close to +nothing. + +But, perhaps the most important security risk is if an attacker is able to +access the database directly and bypass all the isolation in the Minecraft +protocol, in order to wipe or corrupt the data for malicious reasons. This would +likely lead to the Minecraft server being unable to be played, and degrade the +experience of the players. It is my plan to take advantage of the limitations of +the types of Minecraft items to provide resilience and easy backups to the +system, because of the purpose-built nature of the system +\footnote{\url{https://twitter.com/eatonphil/status/1568247643788267521?s=20}}. + +\subsection{Considerations in Fairness} + +In the implementation of databases, it can often be beneficial to make certain +operations faster, at the expense of others that are not done as often. For +instance, if I notice that players often pull items in and out of their systems +often, but almost never search through the list of items, I can take advantage +of this to speed up the database for the most common operations. However, this +can be problematic if the things that I choose to sacrifice affect a certain +group of users. + +This tradeoff between speed and reliability occurs so often in Computer Science +and is described in terms of percentiles. For instance, if we notice that some +event occurs about half the time, we can say it is in the 50th percentile. +Similarly, if an event only occurs 1\% of the time, we can say it occurs in the +99th percentile. The impossible effect of not hurting anyone when a decision +like this is make is written about by Google \cite{dean2013tail}, who have to make every +decision like this at their scale. + +My plan is to not have any tradeoffs that affect the normal gameplay of the +server, and keep it within the 50ms timeframe that the Minecraft has allocated +to itself. Apart from this, one of the main goals of the project is to give +consistent performance, so any further decisions will be made around the +existing implementation of the Minecraft server. + +%https://www.embedded.com/implementing-a-new-real-time-scheduling-policy-for-linux-part-1/ +%https://www.kernel.org/doc/html/latest/scheduler/sched-design-CFS.html +%https://helix979.github.io/jkoo/post/os-scheduler/ + +\subsection{Considerations in Accessibility} + +By creating this system, I also have to consider if the players are going to +require a certain type of computer. Requiring a certain operating system or a +more powerful computer would limit access to many of the people that were +playing the game before. + +However, by basing the goal of the project on improving the performance of the +already existing implementation, any improvements would result in more people +being able to play than before. Also, by designing the system for normal +hardware and in a cross-platform way, this does not limit the people that are +able to access the improvements. + + +\subsection{Considerations in the Concentration of Power} + +With any improvements to performance to servers in Minecraft, this would allow +many of the larger hosting companies, who rent servers monthly to individual +people, to drive down their hosting costs, and allow them to have larger returns +over the smaller providers. However, since this market is so competitive between +companies, because of how easy it is to set up a company, and the options +between companies aren't very different, I would expect any improvement to be +quickly disappear into the competitive market, and benefit everyone equally. + +\section{Future Work, and Conclusion} + +\printbibliography + +\end{document} diff --git a/paper/oxycomps.sty b/paper/oxycomps.sty new file mode 100644 index 0000000..806ec11 --- /dev/null +++ b/paper/oxycomps.sty @@ -0,0 +1,102 @@ +% A simple two-column LaTeX style for Occidental College's CS senior projects. +% Based on latex8.sty by Paolo.Ienne@di.epfl.ch + +\usepackage{times} % use Times as the default font +% define bold 11pt Times font for second-order headings +\font\elvbf = ptmb scaled 1100 + +\usepackage[style=numeric,sorting=nyt]{biblatex} % format the bibliography nicely +\usepackage{xpatch} % used to patch \textcite + +% change \textcite to do family-name (year) +\xpatchbibmacro{textcite} + {\printnames{labelname}} + {\printnames{labelname} (\printfield{year})} + {} + {} +% sort bibliography by last name +\DeclareNameAlias{default}{family-given} + +\usepackage{amsfonts} % provides many math symbols/fonts +\usepackage{amsmath} % provides many math environments +\usepackage{amssymb} % provides many math symbols/fonts +\usepackage{caption} % fixes caption spacing issues +\usepackage[usenames,dvipsnames]{color} % allows for colored text +\usepackage{enumitem} % allows adjustment of list spacing +\usepackage{graphicx} % allows insertion of graphics +\usepackage{hyperref} % creates links within the page and to URLs +\usepackage{listings} % provides the lstlisting environment +\usepackage{url} % formats URLs properly +\usepackage{verbatim} % provides the comment environment + +% set dimensions of columns, gap between columns, and paragraph indent +\setlength{\textheight}{8.875in} +\setlength{\textwidth}{6.875in} +\setlength{\columnsep}{0.3125in} +\setlength{\topmargin}{0in} +\setlength{\headheight}{0in} +\setlength{\headsep}{0in} +\setlength{\parindent}{1em} +\setlength{\oddsidemargin}{-.304in} +\setlength{\evensidemargin}{-.304in} + +% remove the space between list items +\setlist{noitemsep} + +% style code listings +\lstset{ + basicstyle=\ttfamily\footnotesize, + breaklines=true, + showstringspaces=false +} + +% style the title +\def\@maketitle{ + \newpage + \begin{center} + {\Large \bf \@title \par} + % add two empty lines at the end of the title + \vspace*{2\baselineskip} + { + \large + \begin{tabular}[t]{c} + \@author + \end{tabular} + \par + } + % add small space at the end of the author name + \vspace*{.5em} + { + \ifx \@empty \@email + \else + \texttt{\@email} + \par + \vspace*{.25em} + \fi + \ifx \@empty \@affiliation + \else + \@affiliation + \fi + } + % add empty line at the end of the title block + \vspace*{\baselineskip} + \end{center} +} + +% style the abstract +\def\abstract{% + \centerline{\large\bf Abstract}% + \vspace*{\baselineskip}% +} + +% define email and affiliation +\def\email#1{\gdef\@email{#1}} +\gdef\@email{} +\def\affiliation#1{\gdef\@affiliation{#1}} +\gdef\@affiliation{} + +% correct heading spacing and type +\def\section{\@startsection {section}{1}{\z@} + {14pt plus 2pt minus 2pt}{14pt plus 2pt minus 2pt} {\large\bf}} +\def\subsection{\@startsection {subsection}{2}{\z@} + {13pt plus 2pt minus 2pt}{13pt plus 2pt minus 2pt} {\elvbf}} diff --git a/paper/references.bib b/paper/references.bib new file mode 100644 index 0000000..7cc93b2 --- /dev/null +++ b/paper/references.bib @@ -0,0 +1,307 @@ +// Introduction + +@misc{sqliteOnlyDatabase, + title={SQLite the only database you will ever need in most cases}, + url={https://unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html}, + journal={https://unixsheikh.com/}, + publisher={https://unixsheikh.com/}, + author={Sheikh, Unix}, + year={2021}, + month={Apr}, +} + +@misc{ enwiki:1181180757, + author = "{Wikipedia contributors}", + title = "Model–view–controller --- {Wikipedia}{,} The Free Encyclopedia", + year = "2023", + howpublished = "\url{https://en.wikipedia.org/w/index.php?title=Model%E2%80%93view%E2%80%93controller&oldid=1181180757}", + note = "[Online; accessed 13-December-2023]" +} + +@online{googlePerfTeam, + author = {{Google Performance Team}}, + title = {System Performance}, + month = {May}, + year = {2023}, + url = {https://research.google/teams/system-performance/}, +} + +// Applications of voxels + +@misc{ enwiki:1186283262, + author = "{Wikipedia contributors}", + title = "Voxel --- {Wikipedia}{,} The Free Encyclopedia", + year = "2023", + howpublished = "\url{https://en.wikipedia.org/w/index.php?title=Voxel&oldid=1186283262}", + note = "[Online; accessed 13-December-2023]" +} + +@article{norman2006beyond, + title={Beyond mind-reading: multi-voxel pattern analysis of fMRI data}, + author={Norman, Kenneth A and Polyn, Sean M and Detre, Greg J and Haxby, James V}, + journal={Trends in cognitive sciences}, + volume={10}, + number={9}, + pages={424--430}, + year={2006}, + publisher={Elsevier} +} + +@article{museth2013vdb, + title={VDB: High-resolution sparse volumes with dynamic topology}, + author={Museth, Ken}, + journal={ACM transactions on graphics (TOG)}, + volume={32}, + number={3}, + pages={1--22}, + year={2013}, + publisher={ACM New York, NY, USA} +} + +@article{li2020deep, + title={Deep learning for lidar point clouds in autonomous driving: A review}, + author={Li, Ying and Ma, Lingfei and Zhong, Zilong and Liu, Fei and Chapman, Michael A and Cao, Dongpu and Li, Jonathan}, + journal={IEEE Transactions on Neural Networks and Learning Systems}, + volume={32}, + number={8}, + pages={3412--3432}, + year={2020}, + publisher={IEEE} +} + +// Literature Review + +@article{williams1992voxel, + title={Voxel databases: A paradigm for parallelism with spatial structure}, + author={Williams, Roy D}, + journal={Concurrency: Practice and Experience}, + volume={4}, + number={8}, + pages={619--636}, + year={1992}, + publisher={Wiley Online Library} +} + +@article{gorte2023analysis, + title={Analysis of very large voxel datasets}, + author={Gorte, Ben}, + journal={International Journal of Applied Earth Observation and Geoinformation}, + volume={119}, + pages={103316}, + year={2023}, + publisher={Elsevier} +} + +@online{tigerbeetleDesign, + author = {{Tigerbeetle Developers}}, + title = {Tigerbeetle Design Document}, + month = {July}, + year = {2020}, + url = {https://github.com/tigerbeetledb/tigerbeetle/blob/main/docs/DESIGN.md}, +} + +@online{tigerbeetlePerf, + author = {{Tigerbeetle Developers}}, + title = {Tigerbeetle Design Document}, + month = {July}, + year = {2020}, + url = {https://github.com/tigerbeetledb/tigerbeetle/blob/main/docs/HISTORY.md}, +} + +@online{nomiSlowME, + author = {{Jokercortex}}, + title = {Moron's Guide to Managing Mechanical Monstrosities}, + month = {Feb}, + year = {2020}, + url = {https://github.com/Nomifactory/Guides/blob/latest/guides/AE2ForDummies.md}, +} + +@misc{btree, + author = "{Wikipedia contributors}", + title = "B-tree --- {Wikipedia}{,} The Free Encyclopedia", + year = "2023", + url = "https://en.wikipedia.org/w/index.php?title=B-tree&oldid=1146616935", + note = "[Online; accessed 13-May-2023]" +} + +@misc{kvdatabase, + author = "{Wikipedia contributors}", + title = "Key–value database --- {Wikipedia}{,} The Free Encyclopedia", + year = "2023", + url = "https://en.wikipedia.org/w/index.php?title=Key%E2%80%93value_database&oldid=1135560734", + note = "[Online; accessed 13-May-2023]" +} + +@online{latencyKnow, + author = "Jeff Dean", + title = "Latency Numbers Every Programmer Should Know", + year = "2018", + url = "https://gist.github.com/jboner/2841832", + note = "[Online; accessed 12-Dec-2023]" +} + +@online{cockroachData, + author = {{CockroachDB Developers}}, + title = {Structured data encoding in CockroachDB SQL}, + year = {2017}, + month = Mar, + url = {https://github.com/cockroachdb/cockroach/blob/master/docs/tech-notes/encoding.md}, +} + +@article{dong2021rocksdb, + title={Rocksdb: Evolution of development priorities in a key-value store serving large-scale applications}, + author={Dong, Siying and Kryczka, Andrew and Jin, Yanqin and Stumm, Michael}, + journal={ACM Transactions on Storage (TOS)}, + volume={17}, + number={4}, + pages={1--32}, + year={2021}, + publisher={ACM New York, NY} +} + +@misc{lsm, + author = "{Wikipedia contributors}", + title = "Log-structured merge-tree --- {Wikipedia}{,} The Free Encyclopedia", + year = "2023", + url = "https://en.wikipedia.org/w/index.php?title=Log-structured_merge-tree&oldid=1153046573", + note = "[Online; accessed 13-May-2023]" +} + +@online{lsmUses, + author = {{Braden Groom}}, + title = {Understanding LSM Trees: What Powers Write-Heavy Databases}, + month = Jun, + year = {2020}, + url = {https://yetanotherdevblog.com/lsm/}, +} + +@article{chang2008bigtable, + title={Bigtable: A distributed storage system for structured data}, + author={Chang, Fay and Dean, Jeffrey and Ghemawat, Sanjay and Hsieh, Wilson C and Wallach, Deborah A and Burrows, Mike and Chandra, Tushar and Fikes, Andrew and Gruber, Robert E}, + journal={ACM Transactions on Computer Systems (TOCS)}, + volume={26}, + number={2}, + pages={1--26}, + year={2008}, + publisher={ACM New York, NY, USA} +} + +@inproceedings{abadi2008column, + title={Column-stores vs. row-stores: how different are they really?}, + author={Abadi, Daniel J and Madden, Samuel R and Hachem, Nabil}, + booktitle={Proceedings of the 2008 ACM SIGMOD international conference on Management of data}, + pages={967--980}, + year={2008} +} + +@article{athanassoulis2019optimal, + title={Optimal column layout for hybrid workloads}, + author={Athanassoulis, Manos and B{\o}gh, Kenneth S and Idreos, Stratos}, + journal={Proceedings of the VLDB Endowment}, + volume={12}, + number={13}, + pages={2393--2407}, + year={2019}, + publisher={VLDB Endowment} +} + +@inproceedings{armbrust2021lakehouse, + title={Lakehouse: a new generation of open platforms that unify data warehousing and advanced analytics}, + author={Armbrust, Michael and Ghodsi, Ali and Xin, Reynold and Zaharia, Matei}, + booktitle={Proceedings of CIDR}, + volume={8}, + year={2021} +} + +@article{dean2013tail, + title={The tail at scale}, + author={Dean, Jeffrey and Barroso, Luiz Andr{\'e}}, + journal={Communications of the ACM}, + volume={56}, + number={2}, + pages={74--80}, + year={2013}, + publisher={ACM New York, NY, USA} +} + +https://github.blog/2021-09-27-partitioning-githubs-relational-databases-scale/#:~:text=Yet%20at%20its%20core%2C%20GitHub,%2C%20issues%2C%20and%20pull%20requests. +@misc{githubSingleSQL, + title={Partitioning github’s relational databases to handle scale}, + url={https://github.blog/2021-09-27-partitioning-githubs-relational-databases-scale/}, + journal={The GitHub Blog}, + publisher={GitHub}, + author={Maurer, Thomas}, + year={2021}, + month={Sep}, +} + +@inproceedings{bronson2013tao, + title={$\{$TAO$\}$: Facebook’s distributed data store for the social graph}, + author={Bronson, Nathan and Amsden, Zach and Cabrera, George and Chakka, Prasad and Dimov, Peter and Ding, Hui and Ferris, Jack and Giardullo, Anthony and Kulkarni, Sachin and Li, Harry and others}, + booktitle={2013 $\{$USENIX$\}$ Annual Technical Conference ($\{$USENIX$\}$$\{$ATC$\}$ 13)}, + pages={49--60}, + year={2013} +} + +@inproceedings{chatterji2002complexity, + title={On the complexity of approximate query optimization}, + author={Chatterji, Sourav and Evani, Sai Surya Kiran and Ganguly, Sumit and Yemmanuru, Mahesh Datt}, + booktitle={Proceedings of the twenty-first ACM SIGMOD-SIGACT-SIGART symposium on Principles of database systems}, + pages={282--292}, + year={2002} +} + +@inproceedings{gjengset2018noria, + title={Noria: dynamic, partially-stateful data-flow for high-performance web applications.}, + author={Gjengset, Jon and Schwarzkopf, Malte and Behrens, Jonathan and Ara{\'u}jo, Lara Timb{\'o} and Ek, Martin and Kohler, Eddie and Kaashoek, M Frans and Morris, Robert Tappan}, + booktitle={OSDI}, + volume={18}, + pages={213--231}, + year={2018} +} + +How storage works in database systems, and the evolution of how data is stored +@article{stonebraker2005goes, + title={What goes around comes around}, + author={Stonebraker, Michael and Hellerstein, Joey}, + journal={Readings in database systems}, + volume={4}, + pages={1}, + year={2005} +} + +@article{vohra2016apache, + title={Apache parquet}, + author={Vohra, Deepak and Vohra, Deepak}, + journal={Practical Hadoop Ecosystem: A Definitive Guide to Hadoop-Related Frameworks and Tools}, + pages={325--335}, + year={2016}, + publisher={Springer} +} + +@inproceedings{nishtala2013scaling, + title={Scaling memcache at facebook}, + author={Nishtala, Rajesh and Fugal, Hans and Grimm, Steven and Kwiatkowski, Marc and Lee, Herman and Li, Harry C and McElroy, Ryan and Paleczny, Mike and Peek, Daniel and Saab, Paul and others}, + booktitle={Presented as part of the 10th $\{$USENIX$\}$ Symposium on Networked Systems Design and Implementation ($\{$NSDI$\}$ 13)}, + pages={385--398}, + year={2013} +} + +@inproceedings{zhou2021foundationdb, + title={Foundationdb: A distributed unbundled transactional key value store}, + author={Zhou, Jingyu and Xu, Meng and Shraer, Alexander and Namasivayam, Bala and Miller, Alex and Tschannen, Evan and Atherton, Steve and Beamon, Andrew J and Sears, Rusty and Leach, John and others}, + booktitle={Proceedings of the 2021 International Conference on Management of Data}, + pages={2653--2666}, + year={2021} +} + +@article{lakshman2010cassandra, + title={Cassandra: a decentralized structured storage system}, + author={Lakshman, Avinash and Malik, Prashant}, + journal={ACM SIGOPS operating systems review}, + volume={44}, + number={2}, + pages={35--40}, + year={2010}, + publisher={ACM New York, NY, USA} +}