├── .gitignore ├── LICENSE ├── README.md ├── pom.xml ├── results ├── createIndex_1k.png ├── createIndex_Greek.png ├── deleteBatch_1k.png ├── deleteBatch_Greek.png ├── deleteOne_1k.png ├── deleteOne_Greek.png ├── insertBatch_1k.png ├── insertBatch_Greek.png ├── insertOne_1k.png ├── insertOne_Greek.png ├── plot.py ├── rtreebm.txt ├── searchNearest_1k.png ├── searchNearest_Greek.png ├── searchOneBackpressure_1k.png ├── searchOneBackpressure_Greek.png ├── searchOne_1k.png └── searchOne_Greek.png └── src └── main ├── java └── com │ └── github │ └── ambling │ └── rtreebenchmark │ ├── DefaultRTree.java │ ├── FBSRTree.java │ ├── GreekEarthquakes.java │ ├── RStarTree.java │ ├── RTreeBenchmark.java │ ├── STRFullRTree.java │ └── STRRTree.java └── resources ├── 1000.txt └── greek-earthquakes-1964-2000.txt.gz /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | .idea/ 3 | rtree-benchmark.iml 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | rtree benchmark 2 | ========= 3 | 4 | A comprehensive understanding of the rtree's performance need a comprehensive benchmark. 5 | 6 | Dave Moten provides us an awesome pure-java [implementation of rtree](https://github.com/davidmoten/rtree), which 7 | supports multiple split strategies (e.g. quadratic and R*-tree huristics) and features (e.g. STR bulk loading and 8 | Flatbuffers backed structure). This project is created to present a comprehensive performance evaluation on the 9 | various rtree types. 10 | 11 | Note: this is an on-going work, helps or suggests are very appreciated. 12 | 13 | 14 | ### How to run 15 | 16 | The project is based on [jmh](http://openjdk.java.net/projects/code-tools/jmh/), and is supported to be used as the 17 | official guide recommends: 18 | 19 | ```bash 20 | $ mvn clean install 21 | $ java -jar target/microbenchmarks.jar 22 | ``` 23 | 24 | *Important note*: since currently this benchmark runs on a snapshot version of rtree (to test the feature of STR bulk loading), 25 | you may need to pull the latest code from master branch of the rtree project and build and deploy the snapshot maven 26 | library to your local environment. 27 | 28 | ### Results 29 | We conduct the experiments on a desktop server with: 30 | - 4-core Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 31 | - 16GB DDR3 Memory 32 | - CentOS Linux 7 with linux kernel 3.10.0-327.el7.x86_64 33 | - openjdk-1.8.0.71-2.b15.el7_2.x86_64 34 | 35 | The experiments are conducted on two datasets: 36 | 37 | - *Greek*: a collection of some 38,377 entries corresponding to the epicentres of earthquakes in Greece between 1964 and 2000. 38 | - *1k*: uniformly generated 1000 rectangles. 39 | 40 | The benchmarked rtree types are: 41 | 42 | - *DefaultRTree*: the original rtree implementation proposed by Guttman with quadratic split. 43 | - *StarRTree*: R*-tree huristics. 44 | - *STRRTree*: STR bulk loaded R*-tree, with a default full ratio (0.7) in each node. 45 | - *STRFullRTree*: STR bulk loaded R*-tree, with full nodes. 46 | - *FBSRTree*: R*-tree loaded from a Flatbuffers serialized byte array. 47 | 48 | We test the performane of several operations on each type of rtree against various `maxChildren` parameter. 49 | TODO: we should test the performance against dataset size. 50 | 51 | The results are plotted with [plot.py](results/plot.py) and are presented as below. 52 | 53 | *Note: since the creation time of indexes span a large range, we use a logarithmic scale for the y axis.* 54 | 55 | | Greek | 1k | 56 | | :-------------: | :-----------: | 57 | | | | 58 | | | | 59 | | | | 60 | | | | 61 | | | | 62 | | | | 63 | | | | 64 | | | | 65 | 66 | 67 | Full results are presented in [rtreebm.txt](results/rtreebm.txt). 68 | 69 | ### Analysis 70 | 71 | ##### Creation 72 | - *FBSRTree* is much faster than others, because it just loads the context and the root node, and it lazily loaded the nodes when need. 73 | - *STR-Rtree* shows an order of magnitude of speedup comparing against the normal (R*-tree or DefaultRtree) creation process, 74 | and shows little difference about the node full ratio (but maybe differ in index size). 75 | - *R*-tree* is the slowest to construct. 76 | 77 | ##### Insertion 78 | - *Default Rtree* shows the best insertion performance, both in one insertion and batch insertion. 79 | - *STR-Rtree* is not bad in single insertion if not full. Full STR-Rtree works as bad as the FBSRtree for one insertion. 80 | - If there are a lot of insertions occurs (need node split anyway), the performance of STR-Rtree is similar to R*-tree. 81 | - *FBS RTree* is slow at insertion. 82 | - It seems that less children is better for insertion. 83 | 84 | ##### Deletion 85 | - It shows similar deletion performance for *DefaultRTree* and *R\*-tree* (for deletion, STR-Rtree is also R*-tree). 86 | - *FBS RTree* is 10x slower at deletion. 87 | - It seems that 10 children per node is good for deletion. 88 | 89 | ##### Range Search 90 | - *R\*-tree* shows the best search performance for most cases. 91 | - *STR-Rtree* is not bad, and non-full nodes shows better than full nodes. 92 | - *FBS RTree* is 10x slower at search. 93 | - Backpressure shows performance decline. 94 | - Small nodes (less children) is better at search for most cases. 95 | 96 | ##### Nearest Search 97 | - Currently (rtree-0.8-RC11-SNAPSHOT), the nearest search is based on a range search, therefore the results are similar. -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 25 | 26 | 28 | 4.0.0 29 | 30 | com.github.ambling 31 | rtree-benchmark 32 | 0.1 33 | jar 34 | 35 | Auto-generated JMH benchmark 36 | 37 | 38 | 39 | org.openjdk.jmh 40 | jmh-core 41 | 0.6 42 | 43 | 44 | org.openjdk.jmh 45 | jmh-generator-annprocess 46 | 0.6 47 | provided 48 | 49 | 50 | 51 | com.github.davidmoten 52 | flatbuffers-java 53 | 1.3.0.1 54 | 55 | 56 | 57 | com.github.davidmoten 58 | rtree 59 | 0.8-RC11-SNAPSHOT 60 | 61 | 62 | 63 | io.reactivex 64 | rxjava-string 65 | 0.22.0 66 | 67 | 68 | 69 | 70 | UTF-8 71 | 72 | 73 | 74 | 75 | 76 | org.apache.maven.plugins 77 | maven-compiler-plugin 78 | 3.0 79 | 80 | 1.6 81 | 1.6 82 | 1.6 83 | 84 | 85 | 86 | org.apache.maven.plugins 87 | maven-shade-plugin 88 | 2.0 89 | 90 | 91 | package 92 | 93 | shade 94 | 95 | 96 | microbenchmarks 97 | 98 | 99 | org.openjdk.jmh.Main 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /results/createIndex_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/createIndex_1k.png -------------------------------------------------------------------------------- /results/createIndex_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/createIndex_Greek.png -------------------------------------------------------------------------------- /results/deleteBatch_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/deleteBatch_1k.png -------------------------------------------------------------------------------- /results/deleteBatch_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/deleteBatch_Greek.png -------------------------------------------------------------------------------- /results/deleteOne_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/deleteOne_1k.png -------------------------------------------------------------------------------- /results/deleteOne_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/deleteOne_Greek.png -------------------------------------------------------------------------------- /results/insertBatch_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/insertBatch_1k.png -------------------------------------------------------------------------------- /results/insertBatch_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/insertBatch_Greek.png -------------------------------------------------------------------------------- /results/insertOne_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/insertOne_1k.png -------------------------------------------------------------------------------- /results/insertOne_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/insertOne_Greek.png -------------------------------------------------------------------------------- /results/plot.py: -------------------------------------------------------------------------------- 1 | import matplotlib.colors as cl 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | 5 | class ResultReader: 6 | 7 | def __init__(self): 8 | self.lines = list() 9 | self.op = "" 10 | self.ds = "" 11 | self.markers = ['o', '*', '+', '^', 'x', 'd', 's', 'p'] 12 | # http://ksrowell.com/blog-visualizing-data/2012/02/02/optimal-colors-for-graphs/ 13 | self.colors = [(57, 106, 177), (218, 124, 48), (62, 100, 81), 14 | (204, 37, 41), (83, 81, 84), (107, 76, 154), 15 | (146, 36, 40), (148, 139, 61)] 16 | self.colors = map(lambda x: (1.0 * x[0] / 255, 17 | 1.0 * x[1] / 255, 18 | 1.0 * x[2] / 255), 19 | self.colors) 20 | self.data = {} 21 | 22 | def read(self, path): 23 | with open(path, 'r') as f: 24 | self.lines = f.readlines() 25 | 26 | def get_match(self): 27 | for line in self.lines: 28 | if line.startswith("c.g.a.r"): 29 | tokens = line.split() 30 | indexName = tokens[0].split(".")[4] 31 | operation = tokens[0].split(".")[6] 32 | childrenNumber = int(tokens[0].split(".")[5][1:]) 33 | if operation == self.op + self.ds: 34 | throughput = float(tokens[3]) 35 | if not self.data.has_key(indexName): 36 | self.data[indexName] = {} 37 | self.data[indexName][childrenNumber] = throughput 38 | 39 | def draw(self, save, filename): 40 | figdata = plt.figure() 41 | for i, d in enumerate(self.data.items()): 42 | xaxis = list() 43 | yaxis = list() 44 | for childrenNumber in d[1]: 45 | xaxis.append(childrenNumber) 46 | yaxis.append(d[1][childrenNumber]) 47 | 48 | marker = self.markers[i] 49 | color = self.colors[i] 50 | plt.plot(np.array(xaxis), np.array(yaxis), 51 | marker=marker, color=color, linestyle='-', label=d[0]) 52 | 53 | plt.title(self.op + " on " + self.ds, y=1.13, fontweight='bold') 54 | plt.xticks((4, 10, 32, 128), (4, 10, 32, 128)) 55 | plt.xlabel("max children") 56 | if self.op == "createIndex": 57 | plt.yscale("log") 58 | plt.ylabel("throughput op/s") 59 | # the location of the legend works good for most figures 60 | lgd = plt.legend(loc='upper right', bbox_to_anchor=(1, 1.15), 61 | numpoints=1, ncol=3, frameon=False) 62 | if save: 63 | figdata.savefig(filename, bbox_extra_artists=(lgd,), bbox_inches='tight') 64 | else: 65 | plt.show() 66 | 67 | 68 | if __name__ == "__main__": 69 | 70 | opList = ["createIndex", "searchOne", "searchNearest", 71 | "insertOne", "insertBatch", "deleteOne", "deleteBatch", 72 | "searchOneBackpressure"] 73 | dataList = ["1k", "Greek"] 74 | 75 | rr = ResultReader() 76 | rr.read("rtreebm.txt") 77 | 78 | for _op in opList: 79 | for _ds in dataList: 80 | rr.op = _op 81 | rr.ds = _ds 82 | rr.get_match() 83 | rr.draw(True, _op + "_" + _ds + ".png") 84 | -------------------------------------------------------------------------------- /results/rtreebm.txt: -------------------------------------------------------------------------------- 1 | Benchmark Mode Samples Mean Mean error Units 2 | c.g.a.r.DefaultRTree.M10.createIndex1k thrpt 10 719.417 2.057 ops/s 3 | c.g.a.r.DefaultRTree.M10.createIndexGreek thrpt 10 11.395 0.029 ops/s 4 | c.g.a.r.DefaultRTree.M10.deleteBatch1k thrpt 10 945.702 1.548 ops/s 5 | c.g.a.r.DefaultRTree.M10.deleteBatchGreek thrpt 10 12.903 0.061 ops/s 6 | c.g.a.r.DefaultRTree.M10.deleteOne1k thrpt 10 986158.705 5580.438 ops/s 7 | c.g.a.r.DefaultRTree.M10.deleteOneGreek thrpt 10 477862.020 3473.075 ops/s 8 | c.g.a.r.DefaultRTree.M10.insertBatch1k thrpt 10 958.917 2.251 ops/s 9 | c.g.a.r.DefaultRTree.M10.insertBatchGreek thrpt 10 18.230 0.110 ops/s 10 | c.g.a.r.DefaultRTree.M10.insertOne1k thrpt 10 187065.733 636.532 ops/s 11 | c.g.a.r.DefaultRTree.M10.insertOneGreek thrpt 10 590899.677 1025.698 ops/s 12 | c.g.a.r.DefaultRTree.M10.searchNearest1k thrpt 10 880787.457 3212.797 ops/s 13 | c.g.a.r.DefaultRTree.M10.searchNearestGreek thrpt 10 11029.585 34.180 ops/s 14 | c.g.a.r.DefaultRTree.M10.searchOne1k thrpt 10 737257.560 1384.433 ops/s 15 | c.g.a.r.DefaultRTree.M10.searchOneBackpressure1k thrpt 10 156136.060 1413.775 ops/s 16 | c.g.a.r.DefaultRTree.M10.searchOneBackpressureGreek thrpt 10 118278.557 1220.491 ops/s 17 | c.g.a.r.DefaultRTree.M10.searchOneGreek thrpt 10 756240.623 1142.002 ops/s 18 | c.g.a.r.DefaultRTree.M128.createIndex1k thrpt 10 244.705 1.008 ops/s 19 | c.g.a.r.DefaultRTree.M128.createIndexGreek thrpt 10 5.222 0.017 ops/s 20 | c.g.a.r.DefaultRTree.M128.deleteBatch1k thrpt 10 421.452 2.231 ops/s 21 | c.g.a.r.DefaultRTree.M128.deleteBatchGreek thrpt 10 5.762 0.029 ops/s 22 | c.g.a.r.DefaultRTree.M128.deleteOne1k thrpt 10 817355.057 2518.959 ops/s 23 | c.g.a.r.DefaultRTree.M128.deleteOneGreek thrpt 10 369552.542 874.448 ops/s 24 | c.g.a.r.DefaultRTree.M128.insertBatch1k thrpt 10 501.218 1.730 ops/s 25 | c.g.a.r.DefaultRTree.M128.insertBatchGreek thrpt 10 6.520 0.020 ops/s 26 | c.g.a.r.DefaultRTree.M128.insertOne1k thrpt 10 929994.577 3260.016 ops/s 27 | c.g.a.r.DefaultRTree.M128.insertOneGreek thrpt 10 201019.610 486.944 ops/s 28 | c.g.a.r.DefaultRTree.M128.searchNearest1k thrpt 10 965367.372 2725.921 ops/s 29 | c.g.a.r.DefaultRTree.M128.searchNearestGreek thrpt 10 10972.080 28.389 ops/s 30 | c.g.a.r.DefaultRTree.M128.searchOne1k thrpt 10 1923453.913 3607.425 ops/s 31 | c.g.a.r.DefaultRTree.M128.searchOneBackpressure1k thrpt 10 246653.342 2078.242 ops/s 32 | c.g.a.r.DefaultRTree.M128.searchOneBackpressureGreek thrpt 10 37242.265 372.977 ops/s 33 | c.g.a.r.DefaultRTree.M128.searchOneGreek thrpt 10 223712.055 1099.848 ops/s 34 | c.g.a.r.DefaultRTree.M32.createIndex1k thrpt 10 588.650 2.088 ops/s 35 | c.g.a.r.DefaultRTree.M32.createIndexGreek thrpt 10 9.958 0.021 ops/s 36 | c.g.a.r.DefaultRTree.M32.deleteBatch1k thrpt 10 960.647 1.698 ops/s 37 | c.g.a.r.DefaultRTree.M32.deleteBatchGreek thrpt 10 9.207 0.058 ops/s 38 | c.g.a.r.DefaultRTree.M32.deleteOne1k thrpt 10 967473.355 3089.304 ops/s 39 | c.g.a.r.DefaultRTree.M32.deleteOneGreek thrpt 10 217247.062 1035.957 ops/s 40 | c.g.a.r.DefaultRTree.M32.insertBatch1k thrpt 10 608.647 2.043 ops/s 41 | c.g.a.r.DefaultRTree.M32.insertBatchGreek thrpt 10 12.768 0.134 ops/s 42 | c.g.a.r.DefaultRTree.M32.insertOne1k thrpt 10 734019.113 1418.178 ops/s 43 | c.g.a.r.DefaultRTree.M32.insertOneGreek thrpt 10 409966.527 994.959 ops/s 44 | c.g.a.r.DefaultRTree.M32.searchNearest1k thrpt 10 1040837.278 8538.843 ops/s 45 | c.g.a.r.DefaultRTree.M32.searchNearestGreek thrpt 10 11633.578 56.467 ops/s 46 | c.g.a.r.DefaultRTree.M32.searchOne1k thrpt 10 649130.548 1702.147 ops/s 47 | c.g.a.r.DefaultRTree.M32.searchOneBackpressure1k thrpt 10 172016.868 1555.665 ops/s 48 | c.g.a.r.DefaultRTree.M32.searchOneBackpressureGreek thrpt 10 104897.005 1180.470 ops/s 49 | c.g.a.r.DefaultRTree.M32.searchOneGreek thrpt 10 528044.100 756.541 ops/s 50 | c.g.a.r.DefaultRTree.M4.createIndex1k thrpt 10 742.747 1.437 ops/s 51 | c.g.a.r.DefaultRTree.M4.createIndexGreek thrpt 10 14.867 0.333 ops/s 52 | c.g.a.r.DefaultRTree.M4.deleteBatch1k thrpt 10 864.280 5.060 ops/s 53 | c.g.a.r.DefaultRTree.M4.deleteBatchGreek thrpt 10 10.667 0.041 ops/s 54 | c.g.a.r.DefaultRTree.M4.deleteOne1k thrpt 10 427749.255 3503.979 ops/s 55 | c.g.a.r.DefaultRTree.M4.deleteOneGreek thrpt 10 388105.477 2989.840 ops/s 56 | c.g.a.r.DefaultRTree.M4.insertBatch1k thrpt 10 1092.040 2.098 ops/s 57 | c.g.a.r.DefaultRTree.M4.insertBatchGreek thrpt 10 19.222 0.144 ops/s 58 | c.g.a.r.DefaultRTree.M4.insertOne1k thrpt 10 340595.688 890.248 ops/s 59 | c.g.a.r.DefaultRTree.M4.insertOneGreek thrpt 10 625505.472 1545.829 ops/s 60 | c.g.a.r.DefaultRTree.M4.searchNearest1k thrpt 10 1882270.175 5435.609 ops/s 61 | c.g.a.r.DefaultRTree.M4.searchNearestGreek thrpt 10 13195.738 66.889 ops/s 62 | c.g.a.r.DefaultRTree.M4.searchOne1k thrpt 10 1412677.392 3463.464 ops/s 63 | c.g.a.r.DefaultRTree.M4.searchOneBackpressure1k thrpt 10 226020.970 893.666 ops/s 64 | c.g.a.r.DefaultRTree.M4.searchOneBackpressureGreek thrpt 10 148653.900 598.575 ops/s 65 | c.g.a.r.DefaultRTree.M4.searchOneGreek thrpt 10 965334.223 6030.142 ops/s 66 | c.g.a.r.FBSRTree.M10.createIndex1k thrpt 10 308009.938 1407.690 ops/s 67 | c.g.a.r.FBSRTree.M10.createIndexGreek thrpt 10 7714.208 367.291 ops/s 68 | c.g.a.r.FBSRTree.M10.deleteBatch1k thrpt 10 584.480 2.266 ops/s 69 | c.g.a.r.FBSRTree.M10.deleteBatchGreek thrpt 10 4.052 0.008 ops/s 70 | c.g.a.r.FBSRTree.M10.deleteOne1k thrpt 10 385107.130 1171.853 ops/s 71 | c.g.a.r.FBSRTree.M10.deleteOneGreek thrpt 10 142451.703 561.039 ops/s 72 | c.g.a.r.FBSRTree.M10.insertBatch1k thrpt 10 217.077 0.785 ops/s 73 | c.g.a.r.FBSRTree.M10.insertBatchGreek thrpt 10 4.977 0.018 ops/s 74 | c.g.a.r.FBSRTree.M10.insertOne1k thrpt 10 122800.193 496.249 ops/s 75 | c.g.a.r.FBSRTree.M10.insertOneGreek thrpt 10 63992.498 232.009 ops/s 76 | c.g.a.r.FBSRTree.M10.searchNearest1k thrpt 10 485102.973 1156.024 ops/s 77 | c.g.a.r.FBSRTree.M10.searchNearestGreek thrpt 10 8809.738 68.847 ops/s 78 | c.g.a.r.FBSRTree.M10.searchOne1k thrpt 10 256881.363 549.350 ops/s 79 | c.g.a.r.FBSRTree.M10.searchOneBackpressure1k thrpt 10 78020.403 150.076 ops/s 80 | c.g.a.r.FBSRTree.M10.searchOneBackpressureGreek thrpt 10 72409.802 203.148 ops/s 81 | c.g.a.r.FBSRTree.M10.searchOneGreek thrpt 10 159870.093 446.311 ops/s 82 | c.g.a.r.FBSRTree.M128.createIndex1k thrpt 10 351842.855 1440.563 ops/s 83 | c.g.a.r.FBSRTree.M128.createIndexGreek thrpt 10 8967.600 293.431 ops/s 84 | c.g.a.r.FBSRTree.M128.deleteBatch1k thrpt 10 149.587 0.514 ops/s 85 | c.g.a.r.FBSRTree.M128.deleteBatchGreek thrpt 10 1.908 0.013 ops/s 86 | c.g.a.r.FBSRTree.M128.deleteOne1k thrpt 10 75043.882 234.760 ops/s 87 | c.g.a.r.FBSRTree.M128.deleteOneGreek thrpt 10 82821.750 265.690 ops/s 88 | c.g.a.r.FBSRTree.M128.insertBatch1k thrpt 10 62.517 0.395 ops/s 89 | c.g.a.r.FBSRTree.M128.insertBatchGreek thrpt 10 0.067 0.000 ops/s 90 | c.g.a.r.FBSRTree.M128.insertOne1k thrpt 10 24621.307 41.255 ops/s 91 | c.g.a.r.FBSRTree.M128.insertOneGreek thrpt 10 746.418 1.133 ops/s 92 | c.g.a.r.FBSRTree.M128.searchNearest1k thrpt 10 127933.535 603.999 ops/s 93 | c.g.a.r.FBSRTree.M128.searchNearestGreek thrpt 10 8741.048 22.320 ops/s 94 | c.g.a.r.FBSRTree.M128.searchOne1k thrpt 10 118588.108 225.943 ops/s 95 | c.g.a.r.FBSRTree.M128.searchOneBackpressure1k thrpt 10 33655.478 214.592 ops/s 96 | c.g.a.r.FBSRTree.M128.searchOneBackpressureGreek thrpt 10 42373.400 103.375 ops/s 97 | c.g.a.r.FBSRTree.M128.searchOneGreek thrpt 10 132844.535 375.816 ops/s 98 | c.g.a.r.FBSRTree.M32.createIndex1k thrpt 10 340824.825 1427.018 ops/s 99 | c.g.a.r.FBSRTree.M32.createIndexGreek thrpt 10 8875.088 593.161 ops/s 100 | c.g.a.r.FBSRTree.M32.deleteBatch1k thrpt 10 230.853 0.747 ops/s 101 | c.g.a.r.FBSRTree.M32.deleteBatchGreek thrpt 10 2.185 0.022 ops/s 102 | c.g.a.r.FBSRTree.M32.deleteOne1k thrpt 10 207667.843 715.750 ops/s 103 | c.g.a.r.FBSRTree.M32.deleteOneGreek thrpt 10 50422.943 136.968 ops/s 104 | c.g.a.r.FBSRTree.M32.insertBatch1k thrpt 10 45.637 0.129 ops/s 105 | c.g.a.r.FBSRTree.M32.insertBatchGreek thrpt 10 1.083 0.000 ops/s 106 | c.g.a.r.FBSRTree.M32.insertOne1k thrpt 10 13524.907 44.833 ops/s 107 | c.g.a.r.FBSRTree.M32.insertOneGreek thrpt 10 15808.113 47.843 ops/s 108 | c.g.a.r.FBSRTree.M32.searchNearest1k thrpt 10 317327.082 880.329 ops/s 109 | c.g.a.r.FBSRTree.M32.searchNearestGreek thrpt 10 9578.373 23.222 ops/s 110 | c.g.a.r.FBSRTree.M32.searchOne1k thrpt 10 97485.975 417.478 ops/s 111 | c.g.a.r.FBSRTree.M32.searchOneBackpressure1k thrpt 10 33237.600 152.531 ops/s 112 | c.g.a.r.FBSRTree.M32.searchOneBackpressureGreek thrpt 10 75889.310 214.524 ops/s 113 | c.g.a.r.FBSRTree.M32.searchOneGreek thrpt 10 192822.212 332.840 ops/s 114 | c.g.a.r.FBSRTree.M4.createIndex1k thrpt 10 246388.305 1176.349 ops/s 115 | c.g.a.r.FBSRTree.M4.createIndexGreek thrpt 10 5669.410 19.090 ops/s 116 | c.g.a.r.FBSRTree.M4.deleteBatch1k thrpt 10 718.547 1.948 ops/s 117 | c.g.a.r.FBSRTree.M4.deleteBatchGreek thrpt 10 3.357 0.013 ops/s 118 | c.g.a.r.FBSRTree.M4.deleteOne1k thrpt 10 550034.845 1973.387 ops/s 119 | c.g.a.r.FBSRTree.M4.deleteOneGreek thrpt 10 108132.615 292.919 ops/s 120 | c.g.a.r.FBSRTree.M4.insertBatch1k thrpt 10 398.543 1.479 ops/s 121 | c.g.a.r.FBSRTree.M4.insertBatchGreek thrpt 10 7.842 0.057 ops/s 122 | c.g.a.r.FBSRTree.M4.insertOne1k thrpt 10 165300.463 365.968 ops/s 123 | c.g.a.r.FBSRTree.M4.insertOneGreek thrpt 10 104569.895 409.670 ops/s 124 | c.g.a.r.FBSRTree.M4.searchNearest1k thrpt 10 529563.432 1064.740 ops/s 125 | c.g.a.r.FBSRTree.M4.searchNearestGreek thrpt 10 8500.588 86.923 ops/s 126 | c.g.a.r.FBSRTree.M4.searchOne1k thrpt 10 249839.162 648.138 ops/s 127 | c.g.a.r.FBSRTree.M4.searchOneBackpressure1k thrpt 10 148508.237 780.700 ops/s 128 | c.g.a.r.FBSRTree.M4.searchOneBackpressureGreek thrpt 10 132758.750 474.568 ops/s 129 | c.g.a.r.FBSRTree.M4.searchOneGreek thrpt 10 291072.100 707.047 ops/s 130 | c.g.a.r.RStarTree.M10.createIndex1k thrpt 10 366.038 0.944 ops/s 131 | c.g.a.r.RStarTree.M10.createIndexGreek thrpt 10 7.227 0.021 ops/s 132 | c.g.a.r.RStarTree.M10.deleteBatch1k thrpt 10 863.355 2.375 ops/s 133 | c.g.a.r.RStarTree.M10.deleteBatchGreek thrpt 10 10.592 0.052 ops/s 134 | c.g.a.r.RStarTree.M10.deleteOne1k thrpt 10 1078178.993 4596.369 ops/s 135 | c.g.a.r.RStarTree.M10.deleteOneGreek thrpt 10 749688.912 5490.636 ops/s 136 | c.g.a.r.RStarTree.M10.insertBatch1k thrpt 10 503.273 1.693 ops/s 137 | c.g.a.r.RStarTree.M10.insertBatchGreek thrpt 10 10.088 0.043 ops/s 138 | c.g.a.r.RStarTree.M10.insertOne1k thrpt 10 540386.917 1822.294 ops/s 139 | c.g.a.r.RStarTree.M10.insertOneGreek thrpt 10 285919.633 1092.695 ops/s 140 | c.g.a.r.RStarTree.M10.searchNearest1k thrpt 10 1564875.360 8915.455 ops/s 141 | c.g.a.r.RStarTree.M10.searchNearestGreek thrpt 10 15129.095 53.566 ops/s 142 | c.g.a.r.RStarTree.M10.searchOne1k thrpt 10 1954728.558 4568.043 ops/s 143 | c.g.a.r.RStarTree.M10.searchOneBackpressure1k thrpt 10 272527.348 2296.102 ops/s 144 | c.g.a.r.RStarTree.M10.searchOneBackpressureGreek thrpt 10 182621.593 1686.114 ops/s 145 | c.g.a.r.RStarTree.M10.searchOneGreek thrpt 10 960779.777 2091.742 ops/s 146 | c.g.a.r.RStarTree.M128.createIndex1k thrpt 10 493.683 1.002 ops/s 147 | c.g.a.r.RStarTree.M128.createIndexGreek thrpt 10 0.383 0.000 ops/s 148 | c.g.a.r.RStarTree.M128.deleteBatch1k thrpt 10 597.308 2.886 ops/s 149 | c.g.a.r.RStarTree.M128.deleteBatchGreek thrpt 10 1.202 0.008 ops/s 150 | c.g.a.r.RStarTree.M128.deleteOne1k thrpt 10 609823.868 6826.192 ops/s 151 | c.g.a.r.RStarTree.M128.deleteOneGreek thrpt 10 404741.225 2484.310 ops/s 152 | c.g.a.r.RStarTree.M128.insertBatch1k thrpt 10 361.385 0.651 ops/s 153 | c.g.a.r.RStarTree.M128.insertBatchGreek thrpt 10 0.467 0.000 ops/s 154 | c.g.a.r.RStarTree.M128.insertOne1k thrpt 10 537488.295 1724.468 ops/s 155 | c.g.a.r.RStarTree.M128.insertOneGreek thrpt 10 5166.370 9.566 ops/s 156 | c.g.a.r.RStarTree.M128.searchNearest1k thrpt 10 783783.612 3802.950 ops/s 157 | c.g.a.r.RStarTree.M128.searchNearestGreek thrpt 10 15232.295 219.895 ops/s 158 | c.g.a.r.RStarTree.M128.searchOne1k thrpt 10 1544826.865 6113.098 ops/s 159 | c.g.a.r.RStarTree.M128.searchOneBackpressure1k thrpt 10 191507.425 748.758 ops/s 160 | c.g.a.r.RStarTree.M128.searchOneBackpressureGreek thrpt 10 166833.067 343.403 ops/s 161 | c.g.a.r.RStarTree.M128.searchOneGreek thrpt 10 895266.835 2094.795 ops/s 162 | c.g.a.r.RStarTree.M32.createIndex1k thrpt 10 234.225 0.319 ops/s 163 | c.g.a.r.RStarTree.M32.createIndexGreek thrpt 10 1.968 0.008 ops/s 164 | c.g.a.r.RStarTree.M32.deleteBatch1k thrpt 10 361.743 0.804 ops/s 165 | c.g.a.r.RStarTree.M32.deleteBatchGreek thrpt 10 5.223 0.018 ops/s 166 | c.g.a.r.RStarTree.M32.deleteOne1k thrpt 10 1042636.158 12157.263 ops/s 167 | c.g.a.r.RStarTree.M32.deleteOneGreek thrpt 10 609961.553 4055.699 ops/s 168 | c.g.a.r.RStarTree.M32.insertBatch1k thrpt 10 182.642 0.346 ops/s 169 | c.g.a.r.RStarTree.M32.insertBatchGreek thrpt 10 2.947 0.011 ops/s 170 | c.g.a.r.RStarTree.M32.insertOne1k thrpt 10 63605.002 220.209 ops/s 171 | c.g.a.r.RStarTree.M32.insertOneGreek thrpt 10 59442.023 228.635 ops/s 172 | c.g.a.r.RStarTree.M32.searchNearest1k thrpt 10 1511820.817 9791.564 ops/s 173 | c.g.a.r.RStarTree.M32.searchNearestGreek thrpt 10 16556.428 69.698 ops/s 174 | c.g.a.r.RStarTree.M32.searchOne1k thrpt 10 1348085.732 4513.179 ops/s 175 | c.g.a.r.RStarTree.M32.searchOneBackpressure1k thrpt 10 188951.482 525.812 ops/s 176 | c.g.a.r.RStarTree.M32.searchOneBackpressureGreek thrpt 10 221148.828 1310.024 ops/s 177 | c.g.a.r.RStarTree.M32.searchOneGreek thrpt 10 1243563.467 1462.595 ops/s 178 | c.g.a.r.RStarTree.M4.createIndex1k thrpt 10 608.908 1.715 ops/s 179 | c.g.a.r.RStarTree.M4.createIndexGreek thrpt 10 10.698 0.037 ops/s 180 | c.g.a.r.RStarTree.M4.deleteBatch1k thrpt 10 871.050 2.703 ops/s 181 | c.g.a.r.RStarTree.M4.deleteBatchGreek thrpt 10 10.853 0.069 ops/s 182 | c.g.a.r.RStarTree.M4.deleteOne1k thrpt 10 478271.673 2232.777 ops/s 183 | c.g.a.r.RStarTree.M4.deleteOneGreek thrpt 10 463047.533 4036.076 ops/s 184 | c.g.a.r.RStarTree.M4.insertBatch1k thrpt 10 817.557 3.067 ops/s 185 | c.g.a.r.RStarTree.M4.insertBatchGreek thrpt 10 13.758 0.675 ops/s 186 | c.g.a.r.RStarTree.M4.insertOne1k thrpt 10 748205.473 4871.341 ops/s 187 | c.g.a.r.RStarTree.M4.insertOneGreek thrpt 10 307131.953 968.768 ops/s 188 | c.g.a.r.RStarTree.M4.searchNearest1k thrpt 10 2057648.487 7317.197 ops/s 189 | c.g.a.r.RStarTree.M4.searchNearestGreek thrpt 10 15561.808 57.787 ops/s 190 | c.g.a.r.RStarTree.M4.searchOne1k thrpt 10 1698568.995 4163.696 ops/s 191 | c.g.a.r.RStarTree.M4.searchOneBackpressure1k thrpt 10 269511.908 774.639 ops/s 192 | c.g.a.r.RStarTree.M4.searchOneBackpressureGreek thrpt 10 322781.780 1986.521 ops/s 193 | c.g.a.r.RStarTree.M4.searchOneGreek thrpt 10 1229505.803 4024.594 ops/s 194 | c.g.a.r.STRFullRTree.M10.createIndex1k thrpt 10 6112.245 18.041 ops/s 195 | c.g.a.r.STRFullRTree.M10.createIndexGreek thrpt 10 163.512 0.348 ops/s 196 | c.g.a.r.STRFullRTree.M10.deleteBatch1k thrpt 10 723.605 2.529 ops/s 197 | c.g.a.r.STRFullRTree.M10.deleteBatchGreek thrpt 10 13.993 0.049 ops/s 198 | c.g.a.r.STRFullRTree.M10.deleteOne1k thrpt 10 1493910.237 4338.617 ops/s 199 | c.g.a.r.STRFullRTree.M10.deleteOneGreek thrpt 10 718982.422 4917.254 ops/s 200 | c.g.a.r.STRFullRTree.M10.insertBatch1k thrpt 10 537.743 1.914 ops/s 201 | c.g.a.r.STRFullRTree.M10.insertBatchGreek thrpt 10 11.050 0.029 ops/s 202 | c.g.a.r.STRFullRTree.M10.insertOne1k thrpt 10 97279.485 424.280 ops/s 203 | c.g.a.r.STRFullRTree.M10.insertOneGreek thrpt 10 43562.785 112.622 ops/s 204 | c.g.a.r.STRFullRTree.M10.searchNearest1k thrpt 10 2040717.552 4669.559 ops/s 205 | c.g.a.r.STRFullRTree.M10.searchNearestGreek thrpt 10 18899.825 86.575 ops/s 206 | c.g.a.r.STRFullRTree.M10.searchOne1k thrpt 10 1566622.443 9201.506 ops/s 207 | c.g.a.r.STRFullRTree.M10.searchOneBackpressure1k thrpt 10 296222.187 2807.887 ops/s 208 | c.g.a.r.STRFullRTree.M10.searchOneBackpressureGreek thrpt 10 213113.043 1785.226 ops/s 209 | c.g.a.r.STRFullRTree.M10.searchOneGreek thrpt 10 1211679.030 2007.242 ops/s 210 | c.g.a.r.STRFullRTree.M128.createIndex1k thrpt 10 6475.483 17.001 ops/s 211 | c.g.a.r.STRFullRTree.M128.createIndexGreek thrpt 10 185.305 0.462 ops/s 212 | c.g.a.r.STRFullRTree.M128.deleteBatch1k thrpt 10 481.555 2.085 ops/s 213 | c.g.a.r.STRFullRTree.M128.deleteBatchGreek thrpt 10 2.315 0.008 ops/s 214 | c.g.a.r.STRFullRTree.M128.deleteOne1k thrpt 10 584323.735 1556.585 ops/s 215 | c.g.a.r.STRFullRTree.M128.deleteOneGreek thrpt 10 235103.175 755.759 ops/s 216 | c.g.a.r.STRFullRTree.M128.insertBatch1k thrpt 10 494.937 1.263 ops/s 217 | c.g.a.r.STRFullRTree.M128.insertBatchGreek thrpt 10 0.450 0.000 ops/s 218 | c.g.a.r.STRFullRTree.M128.insertOne1k thrpt 10 6518.873 26.413 ops/s 219 | c.g.a.r.STRFullRTree.M128.insertOneGreek thrpt 10 1636.708 2.833 ops/s 220 | c.g.a.r.STRFullRTree.M128.searchNearest1k thrpt 10 637463.908 3414.808 ops/s 221 | c.g.a.r.STRFullRTree.M128.searchNearestGreek thrpt 10 15465.237 66.446 ops/s 222 | c.g.a.r.STRFullRTree.M128.searchOne1k thrpt 10 659508.197 1471.845 ops/s 223 | c.g.a.r.STRFullRTree.M128.searchOneBackpressure1k thrpt 10 82068.638 712.262 ops/s 224 | c.g.a.r.STRFullRTree.M128.searchOneBackpressureGreek thrpt 10 74989.082 805.592 ops/s 225 | c.g.a.r.STRFullRTree.M128.searchOneGreek thrpt 10 489027.343 800.483 ops/s 226 | c.g.a.r.STRFullRTree.M32.createIndex1k thrpt 10 7269.938 19.085 ops/s 227 | c.g.a.r.STRFullRTree.M32.createIndexGreek thrpt 10 201.143 0.525 ops/s 228 | c.g.a.r.STRFullRTree.M32.deleteBatch1k thrpt 10 460.117 6.877 ops/s 229 | c.g.a.r.STRFullRTree.M32.deleteBatchGreek thrpt 10 8.728 0.021 ops/s 230 | c.g.a.r.STRFullRTree.M32.deleteOne1k thrpt 10 1449276.380 4211.786 ops/s 231 | c.g.a.r.STRFullRTree.M32.deleteOneGreek thrpt 10 555204.433 1626.659 ops/s 232 | c.g.a.r.STRFullRTree.M32.insertBatch1k thrpt 10 236.673 0.574 ops/s 233 | c.g.a.r.STRFullRTree.M32.insertBatchGreek thrpt 10 4.050 0.068 ops/s 234 | c.g.a.r.STRFullRTree.M32.insertOne1k thrpt 10 57867.183 98.120 ops/s 235 | c.g.a.r.STRFullRTree.M32.insertOneGreek thrpt 10 18452.765 52.784 ops/s 236 | c.g.a.r.STRFullRTree.M32.searchNearest1k thrpt 10 1291793.552 3435.910 ops/s 237 | c.g.a.r.STRFullRTree.M32.searchNearestGreek thrpt 10 17803.302 48.263 ops/s 238 | c.g.a.r.STRFullRTree.M32.searchOne1k thrpt 10 916235.675 1637.117 ops/s 239 | c.g.a.r.STRFullRTree.M32.searchOneBackpressure1k thrpt 10 150531.233 1340.445 ops/s 240 | c.g.a.r.STRFullRTree.M32.searchOneBackpressureGreek thrpt 10 146222.250 1388.247 ops/s 241 | c.g.a.r.STRFullRTree.M32.searchOneGreek thrpt 10 967026.005 2357.105 ops/s 242 | c.g.a.r.STRFullRTree.M4.createIndex1k thrpt 10 5484.657 17.538 ops/s 243 | c.g.a.r.STRFullRTree.M4.createIndexGreek thrpt 10 146.253 0.382 ops/s 244 | c.g.a.r.STRFullRTree.M4.deleteBatch1k thrpt 10 694.030 3.145 ops/s 245 | c.g.a.r.STRFullRTree.M4.deleteBatchGreek thrpt 10 14.447 0.054 ops/s 246 | c.g.a.r.STRFullRTree.M4.deleteOne1k thrpt 10 1052847.247 3984.898 ops/s 247 | c.g.a.r.STRFullRTree.M4.deleteOneGreek thrpt 10 680656.480 5107.310 ops/s 248 | c.g.a.r.STRFullRTree.M4.insertBatch1k thrpt 10 688.048 10.247 ops/s 249 | c.g.a.r.STRFullRTree.M4.insertBatchGreek thrpt 10 13.732 0.064 ops/s 250 | c.g.a.r.STRFullRTree.M4.insertOne1k thrpt 10 135570.753 658.796 ops/s 251 | c.g.a.r.STRFullRTree.M4.insertOneGreek thrpt 10 79752.360 369.056 ops/s 252 | c.g.a.r.STRFullRTree.M4.searchNearest1k thrpt 10 1583717.602 32463.452 ops/s 253 | c.g.a.r.STRFullRTree.M4.searchNearestGreek thrpt 10 14649.123 412.282 ops/s 254 | c.g.a.r.STRFullRTree.M4.searchOne1k thrpt 10 1694701.758 40814.417 ops/s 255 | c.g.a.r.STRFullRTree.M4.searchOneBackpressure1k thrpt 10 275826.153 1836.530 ops/s 256 | c.g.a.r.STRFullRTree.M4.searchOneBackpressureGreek thrpt 10 238867.638 3338.009 ops/s 257 | c.g.a.r.STRFullRTree.M4.searchOneGreek thrpt 10 901480.555 6953.202 ops/s 258 | c.g.a.r.STRRTree.M10.createIndex1k thrpt 10 5946.477 44.438 ops/s 259 | c.g.a.r.STRRTree.M10.createIndexGreek thrpt 10 181.343 3.492 ops/s 260 | c.g.a.r.STRRTree.M10.deleteBatch1k thrpt 10 1100.170 26.867 ops/s 261 | c.g.a.r.STRRTree.M10.deleteBatchGreek thrpt 10 17.263 0.395 ops/s 262 | c.g.a.r.STRRTree.M10.deleteOne1k thrpt 10 1251226.570 12473.040 ops/s 263 | c.g.a.r.STRRTree.M10.deleteOneGreek thrpt 10 636906.037 4428.928 ops/s 264 | c.g.a.r.STRRTree.M10.insertBatch1k thrpt 10 597.220 1.348 ops/s 265 | c.g.a.r.STRRTree.M10.insertBatchGreek thrpt 10 12.173 0.043 ops/s 266 | c.g.a.r.STRRTree.M10.insertOne1k thrpt 10 774699.237 1987.920 ops/s 267 | c.g.a.r.STRRTree.M10.insertOneGreek thrpt 10 524120.008 1760.715 ops/s 268 | c.g.a.r.STRRTree.M10.searchNearest1k thrpt 10 2040782.035 8113.322 ops/s 269 | c.g.a.r.STRRTree.M10.searchNearestGreek thrpt 10 16847.942 77.678 ops/s 270 | c.g.a.r.STRRTree.M10.searchOne1k thrpt 10 1579444.605 5888.171 ops/s 271 | c.g.a.r.STRRTree.M10.searchOneBackpressure1k thrpt 10 306926.637 2338.719 ops/s 272 | c.g.a.r.STRRTree.M10.searchOneBackpressureGreek thrpt 10 218686.672 1626.051 ops/s 273 | c.g.a.r.STRRTree.M10.searchOneGreek thrpt 10 1337027.745 2993.351 ops/s 274 | c.g.a.r.STRRTree.M128.createIndex1k thrpt 10 7347.923 24.568 ops/s 275 | c.g.a.r.STRRTree.M128.createIndexGreek thrpt 10 189.710 0.531 ops/s 276 | c.g.a.r.STRRTree.M128.deleteBatch1k thrpt 10 456.058 1.509 ops/s 277 | c.g.a.r.STRRTree.M128.deleteBatchGreek thrpt 10 1.300 0.000 ops/s 278 | c.g.a.r.STRRTree.M128.deleteOne1k thrpt 10 1028053.473 2706.025 ops/s 279 | c.g.a.r.STRRTree.M128.deleteOneGreek thrpt 10 279588.923 1153.602 ops/s 280 | c.g.a.r.STRRTree.M128.insertBatch1k thrpt 10 490.983 0.768 ops/s 281 | c.g.a.r.STRRTree.M128.insertBatchGreek thrpt 10 0.450 0.000 ops/s 282 | c.g.a.r.STRRTree.M128.insertOne1k thrpt 10 716255.500 2848.244 ops/s 283 | c.g.a.r.STRRTree.M128.insertOneGreek thrpt 10 12111.787 60.245 ops/s 284 | c.g.a.r.STRRTree.M128.searchNearest1k thrpt 10 859013.688 1152.372 ops/s 285 | c.g.a.r.STRRTree.M128.searchNearestGreek thrpt 10 17243.208 70.436 ops/s 286 | c.g.a.r.STRRTree.M128.searchOne1k thrpt 10 1372214.778 2888.207 ops/s 287 | c.g.a.r.STRRTree.M128.searchOneBackpressure1k thrpt 10 216787.932 5758.651 ops/s 288 | c.g.a.r.STRRTree.M128.searchOneBackpressureGreek thrpt 10 95522.667 860.443 ops/s 289 | c.g.a.r.STRRTree.M128.searchOneGreek thrpt 10 369234.850 736.817 ops/s 290 | c.g.a.r.STRRTree.M32.createIndex1k thrpt 10 5844.963 14.315 ops/s 291 | c.g.a.r.STRRTree.M32.createIndexGreek thrpt 10 204.118 0.392 ops/s 292 | c.g.a.r.STRRTree.M32.deleteBatch1k thrpt 10 399.133 1.221 ops/s 293 | c.g.a.r.STRRTree.M32.deleteBatchGreek thrpt 10 7.558 0.021 ops/s 294 | c.g.a.r.STRRTree.M32.deleteOne1k thrpt 10 890003.428 2872.864 ops/s 295 | c.g.a.r.STRRTree.M32.deleteOneGreek thrpt 10 616642.460 8804.313 ops/s 296 | c.g.a.r.STRRTree.M32.insertBatch1k thrpt 10 233.662 0.561 ops/s 297 | c.g.a.r.STRRTree.M32.insertBatchGreek thrpt 10 4.217 0.000 ops/s 298 | c.g.a.r.STRRTree.M32.insertOne1k thrpt 10 195669.460 250.455 ops/s 299 | c.g.a.r.STRRTree.M32.insertOneGreek thrpt 10 177551.407 269.575 ops/s 300 | c.g.a.r.STRRTree.M32.searchNearest1k thrpt 10 1469145.820 6294.429 ops/s 301 | c.g.a.r.STRRTree.M32.searchNearestGreek thrpt 10 19454.048 63.555 ops/s 302 | c.g.a.r.STRRTree.M32.searchOne1k thrpt 10 1771129.027 2748.072 ops/s 303 | c.g.a.r.STRRTree.M32.searchOneBackpressure1k thrpt 10 330752.713 2878.680 ops/s 304 | c.g.a.r.STRRTree.M32.searchOneBackpressureGreek thrpt 10 169619.347 2952.397 ops/s 305 | c.g.a.r.STRRTree.M32.searchOneGreek thrpt 10 988762.777 1155.606 ops/s 306 | c.g.a.r.STRRTree.M4.createIndex1k thrpt 10 5134.048 9.347 ops/s 307 | c.g.a.r.STRRTree.M4.createIndexGreek thrpt 10 133.635 0.313 ops/s 308 | c.g.a.r.STRRTree.M4.deleteBatch1k thrpt 10 1104.978 4.664 ops/s 309 | c.g.a.r.STRRTree.M4.deleteBatchGreek thrpt 10 16.278 0.073 ops/s 310 | c.g.a.r.STRRTree.M4.deleteOne1k thrpt 10 856160.808 5135.440 ops/s 311 | c.g.a.r.STRRTree.M4.deleteOneGreek thrpt 10 564135.910 5984.121 ops/s 312 | c.g.a.r.STRRTree.M4.insertBatch1k thrpt 10 858.657 8.775 ops/s 313 | c.g.a.r.STRRTree.M4.insertBatchGreek thrpt 10 14.207 0.784 ops/s 314 | c.g.a.r.STRRTree.M4.insertOne1k thrpt 10 883422.928 10142.458 ops/s 315 | c.g.a.r.STRRTree.M4.insertOneGreek thrpt 10 508873.692 1892.846 ops/s 316 | c.g.a.r.STRRTree.M4.searchNearest1k thrpt 10 2845954.310 20045.647 ops/s 317 | c.g.a.r.STRRTree.M4.searchNearestGreek thrpt 10 15613.767 77.269 ops/s 318 | c.g.a.r.STRRTree.M4.searchOne1k thrpt 10 2050764.158 3391.051 ops/s 319 | c.g.a.r.STRRTree.M4.searchOneBackpressure1k thrpt 10 322323.407 3120.811 ops/s 320 | c.g.a.r.STRRTree.M4.searchOneBackpressureGreek thrpt 10 180849.955 1645.862 ops/s 321 | c.g.a.r.STRRTree.M4.searchOneGreek thrpt 10 1159670.750 2113.256 ops/s 322 | -------------------------------------------------------------------------------- /results/searchNearest_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchNearest_1k.png -------------------------------------------------------------------------------- /results/searchNearest_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchNearest_Greek.png -------------------------------------------------------------------------------- /results/searchOneBackpressure_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchOneBackpressure_1k.png -------------------------------------------------------------------------------- /results/searchOneBackpressure_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchOneBackpressure_Greek.png -------------------------------------------------------------------------------- /results/searchOne_1k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchOne_1k.png -------------------------------------------------------------------------------- /results/searchOne_Greek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/results/searchOne_Greek.png -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/DefaultRTree.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.RTree; 4 | import com.github.davidmoten.rtree.geometry.Point; 5 | import com.github.davidmoten.rtree.geometry.Rectangle; 6 | 7 | /** 8 | * Test on default RTree (quadratic splitter (Guttman)) with various maximum children. 9 | */ 10 | public abstract class DefaultRTree extends RTreeBenchmark { 11 | abstract int maxChildren(); 12 | 13 | @Override 14 | RTree createOnGreek() { 15 | return RTree.maxChildren(maxChildren()). create().add(entriesGreek06); 16 | } 17 | 18 | @Override 19 | RTree createOn1k() { 20 | return RTree.maxChildren(maxChildren()). create().add(entries1k06); 21 | } 22 | 23 | public static class M4 extends DefaultRTree { 24 | @Override 25 | int maxChildren() { 26 | return 4; 27 | } 28 | } 29 | 30 | public static class M10 extends DefaultRTree { 31 | @Override 32 | int maxChildren() { 33 | return 10; 34 | } 35 | } 36 | 37 | public static class M32 extends DefaultRTree { 38 | @Override 39 | int maxChildren() { 40 | return 32; 41 | } 42 | } 43 | 44 | public static class M128 extends DefaultRTree { 45 | @Override 46 | int maxChildren() { 47 | return 128; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/FBSRTree.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.InternalStructure; 4 | import com.github.davidmoten.rtree.RTree; 5 | import com.github.davidmoten.rtree.Serializer; 6 | import com.github.davidmoten.rtree.fbs.SerializerFlatBuffers; 7 | import com.github.davidmoten.rtree.geometry.Geometry; 8 | import com.github.davidmoten.rtree.geometry.Point; 9 | import com.github.davidmoten.rtree.geometry.Rectangle; 10 | import rx.functions.Func1; 11 | 12 | import java.io.ByteArrayInputStream; 13 | import java.io.ByteArrayOutputStream; 14 | import java.io.IOException; 15 | 16 | /** 17 | * Test on R*-tree on Flatbuffers with various maximum children. 18 | * 19 | * To create RTree on Flatbuffers, we need to firstly create the RTree (R*-tree in this case) 20 | * through a generator which is implemented in subclasses, and then transform the tree to a 21 | * byte array. After that, the RTree on Flatbuffers is loaded from the byte array. 22 | * 23 | */ 24 | public abstract class FBSRTree extends RTreeBenchmark { 25 | abstract RStarTree generator(); 26 | 27 | protected byte[] byteArrayGreek = createFBSByteArray(generator().rtreeGreek); 28 | 29 | protected byte[] byteArray1k = createFBSByteArray(generator().rtree1k); 30 | 31 | private byte[] createFBSByteArray(RTree tree) { 32 | final ByteArrayOutputStream os = new ByteArrayOutputStream(); 33 | Func1 serializer = new Func1() { 34 | @Override 35 | public byte[] call(Object o) { 36 | return new byte[0]; 37 | } 38 | }; 39 | Func1 deserializer = new Func1() { 40 | @Override 41 | public Object call(byte[] bytes) { 42 | return null; 43 | } 44 | }; 45 | Serializer fbSerializer = SerializerFlatBuffers.create(serializer, 46 | deserializer); 47 | try { 48 | fbSerializer.write(tree, os); 49 | os.close(); 50 | return os.toByteArray(); 51 | } catch (IOException e) { 52 | throw new RuntimeException(e); 53 | } 54 | } 55 | 56 | private RTree createFBSTree(byte [] byteArray) { 57 | Func1 serializer = new Func1() { 58 | @Override 59 | public byte[] call(Object o) { 60 | return new byte[0]; 61 | } 62 | }; 63 | Func1 deserializer = new Func1() { 64 | @Override 65 | public Object call(byte[] bytes) { 66 | return null; 67 | } 68 | }; 69 | Serializer fbSerializer = SerializerFlatBuffers.create(serializer, 70 | deserializer); 71 | try { 72 | ByteArrayInputStream is = new ByteArrayInputStream(byteArray); 73 | return fbSerializer.read(is, byteArray.length, InternalStructure.SINGLE_ARRAY); 74 | } catch (IOException e) { 75 | throw new RuntimeException(e); 76 | } 77 | } 78 | 79 | @Override 80 | RTree createOnGreek() { 81 | // the array should be initialized in the warmup iteration 82 | if (byteArrayGreek == null) byteArrayGreek = createFBSByteArray(generator().rtreeGreek); 83 | return createFBSTree(byteArrayGreek); 84 | } 85 | 86 | @Override 87 | RTree createOn1k() { 88 | // the array should be initialized in the warmup iteration 89 | if (byteArray1k == null) byteArray1k = createFBSByteArray(generator().rtree1k); 90 | return createFBSTree(byteArray1k); 91 | } 92 | 93 | 94 | public static class M4 extends FBSRTree { 95 | @Override 96 | RStarTree generator() { 97 | return new RStarTree.M4(); 98 | } 99 | } 100 | 101 | public static class M10 extends FBSRTree { 102 | @Override 103 | RStarTree generator() { 104 | return new RStarTree.M10(); 105 | } 106 | } 107 | 108 | public static class M32 extends FBSRTree { 109 | @Override 110 | RStarTree generator() { 111 | return new RStarTree.M32(); 112 | } 113 | } 114 | 115 | public static class M128 extends FBSRTree { 116 | @Override 117 | RStarTree generator() { 118 | return new RStarTree.M128(); 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/GreekEarthquakes.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.Entries; 4 | import com.github.davidmoten.rtree.Entry; 5 | import com.github.davidmoten.rtree.RTree; 6 | import com.github.davidmoten.rtree.geometry.Geometries; 7 | import com.github.davidmoten.rtree.geometry.Point; 8 | import rx.Observable; 9 | import rx.functions.Action1; 10 | import rx.functions.Func0; 11 | import rx.functions.Func1; 12 | import rx.observables.StringObservable; 13 | 14 | import java.io.IOException; 15 | import java.io.InputStream; 16 | import java.io.InputStreamReader; 17 | import java.util.List; 18 | import java.util.zip.GZIPInputStream; 19 | 20 | /** 21 | * The util to load Greek Earthquakes dataset. 22 | * 23 | * Copied from `com.github.davidmoten.rtree.GreekEarthquakes` in test package. 24 | */ 25 | public class GreekEarthquakes { 26 | 27 | public static Observable> entries() { 28 | Observable source = Observable.using(new Func0() { 29 | @Override 30 | public InputStream call() { 31 | try { 32 | return new GZIPInputStream(GreekEarthquakes.class 33 | .getResourceAsStream("/greek-earthquakes-1964-2000.txt.gz")); 34 | } catch (IOException e) { 35 | throw new RuntimeException(e); 36 | } 37 | } 38 | }, new Func1>() { 39 | @Override 40 | public Observable call(InputStream is) { 41 | return StringObservable.from(new InputStreamReader(is)); 42 | } 43 | }, new Action1() { 44 | @Override 45 | public void call(InputStream is) { 46 | try { 47 | is.close(); 48 | } catch (IOException e) { 49 | throw new RuntimeException(e); 50 | } 51 | } 52 | }); 53 | return StringObservable.split(source, "\n") 54 | .flatMap(new Func1>>() { 55 | 56 | @Override 57 | public Observable> call(String line) { 58 | if (line.trim().length() > 0) { 59 | String[] items = line.split(" "); 60 | double lat = Double.parseDouble(items[0]); 61 | double lon = Double.parseDouble(items[1]); 62 | return Observable.just( 63 | Entries.entry(new Object(), Geometries.point(lat, lon))); 64 | } else 65 | return Observable.empty(); 66 | } 67 | }); 68 | } 69 | 70 | static List> entriesList() { 71 | List> result = entries().toList().toBlocking().single(); 72 | System.out.println("loaded greek earthquakes into list"); 73 | return result; 74 | } 75 | 76 | public static void main(String[] args) throws InterruptedException { 77 | RTree tree = RTree.star().create(); 78 | tree = tree.add(entries()).last().toBlocking().single(); 79 | System.gc(); 80 | Thread.sleep(10000000); 81 | System.out.println(tree.size()); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/RStarTree.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.RTree; 4 | import com.github.davidmoten.rtree.geometry.Point; 5 | import com.github.davidmoten.rtree.geometry.Rectangle; 6 | 7 | /** 8 | * Test on R*-tree with various maximum children. 9 | */ 10 | public abstract class RStarTree extends RTreeBenchmark { 11 | abstract int maxChildren(); 12 | 13 | @Override 14 | RTree createOnGreek() { 15 | return RTree.maxChildren(maxChildren()).star(). create().add(entriesGreek06); 16 | } 17 | 18 | @Override 19 | RTree createOn1k() { 20 | return RTree.maxChildren(maxChildren()).star(). create().add(entries1k06); 21 | } 22 | 23 | 24 | public static class M4 extends RStarTree { 25 | @Override 26 | int maxChildren() { 27 | return 4; 28 | } 29 | } 30 | 31 | public static class M10 extends RStarTree { 32 | @Override 33 | int maxChildren() { 34 | return 10; 35 | } 36 | } 37 | 38 | public static class M32 extends RStarTree { 39 | @Override 40 | int maxChildren() { 41 | return 32; 42 | } 43 | } 44 | 45 | public static class M128 extends RStarTree { 46 | @Override 47 | int maxChildren() { 48 | return 128; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/RTreeBenchmark.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. Oracle designates this 8 | * particular file as subject to the "Classpath" exception as provided 9 | * by Oracle in the LICENSE file that accompanied this code. 10 | * 11 | * This code is distributed in the hope that it will be useful, but WITHOUT 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 | * version 2 for more details (a copy is included in the LICENSE file that 15 | * accompanied this code). 16 | * 17 | * You should have received a copy of the GNU General Public License version 18 | * 2 along with this work; if not, write to the Free Software Foundation, 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 | * 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 | * or visit www.oracle.com if you need additional information or have any 23 | * questions. 24 | */ 25 | 26 | package com.github.ambling.rtreebenchmark; 27 | 28 | import com.github.davidmoten.rtree.Entries; 29 | import com.github.davidmoten.rtree.Entry; 30 | import com.github.davidmoten.rtree.RTree; 31 | import com.github.davidmoten.rtree.geometry.Geometries; 32 | import com.github.davidmoten.rtree.geometry.Point; 33 | import com.github.davidmoten.rtree.geometry.Rectangle; 34 | import org.openjdk.jmh.annotations.*; 35 | 36 | import java.io.BufferedReader; 37 | import java.io.IOException; 38 | import java.io.InputStreamReader; 39 | import java.util.ArrayList; 40 | import java.util.List; 41 | import java.util.concurrent.TimeUnit; 42 | 43 | /** 44 | * An abstract class for common benchmark cases. 45 | */ 46 | @BenchmarkMode(Mode.Throughput) 47 | @Fork(1) 48 | @State(Scope.Thread) 49 | @OutputTimeUnit(TimeUnit.SECONDS) 50 | @Warmup(iterations = 5) 51 | @Measurement(iterations = 10) 52 | public abstract class RTreeBenchmark { 53 | 54 | // the datasets, with 60% of the data to construct rtree, and 40% left for batch insertion 55 | protected final List> entriesGreek = GreekEarthquakes.entriesList(); 56 | 57 | protected final List> entriesGreek06 = 58 | entriesGreek.subList(0, (int) (0.6 * entriesGreek.size())); 59 | 60 | protected final List> entriesGreek04 = 61 | entriesGreek.subList((int) (0.6 * entriesGreek.size()), entriesGreek.size()); 62 | 63 | protected final List> entries1k = entries1000(); 64 | 65 | protected final List> entries1k06 = 66 | entries1k.subList(0, (int) (0.6 * entries1k.size())); 67 | 68 | protected final List> entries1k04 = 69 | entries1k.subList((int) (0.6 * entries1k.size()), entries1k.size()); 70 | 71 | static List> entries1000() { 72 | List> list = new ArrayList>(); 73 | BufferedReader br = new BufferedReader( 74 | new InputStreamReader(RTreeBenchmark.class.getResourceAsStream("/1000.txt"))); 75 | String line; 76 | try { 77 | while ((line = br.readLine()) != null) { 78 | String[] items = line.split(" "); 79 | double x = Double.parseDouble(items[0]); 80 | double y = Double.parseDouble(items[1]); 81 | list.add(Entries.entry(new Object(), Geometries.rectangle(x, y, x + 1, y + 1))); 82 | } 83 | br.close(); 84 | } catch (IOException e) { 85 | throw new RuntimeException(e); 86 | } 87 | return list; 88 | } 89 | 90 | /** 91 | * The created RTree instance on Greek data that used to run tests. 92 | */ 93 | protected RTree rtreeGreek = createOnGreek(); 94 | 95 | /** 96 | * The created RTree instance on 1000 rectangles data that used to run tests. 97 | */ 98 | protected RTree rtree1k = createOn1k(); 99 | 100 | /** 101 | * Create the Rtree on Greek data. 102 | */ 103 | abstract RTree createOnGreek(); 104 | 105 | /** 106 | * Create the Rtree on generated rectangles data. 107 | */ 108 | abstract RTree createOn1k(); 109 | 110 | /** 111 | * The benchmark cases, which are inheritanted by subclasses. 112 | * 113 | * User can invoke one or some of the cases through a regular expression, e.g. 114 | * $ java -jar target/microbenchmarks.jar "com.github.ambling.rtreebenchmark.*.createIndexGreek" 115 | */ 116 | @GenerateMicroBenchmark 117 | public RTree createIndexGreek() { 118 | return createOnGreek(); 119 | } 120 | 121 | @GenerateMicroBenchmark 122 | public RTree createIndex1k() { 123 | return createOn1k(); 124 | } 125 | 126 | @GenerateMicroBenchmark 127 | public RTree insertOneGreek() { 128 | return rtreeGreek.add(entriesGreek04.get(0)); 129 | } 130 | 131 | @GenerateMicroBenchmark 132 | public RTree insertOne1k() { 133 | return rtree1k.add(entries1k04.get(0)); 134 | } 135 | 136 | @GenerateMicroBenchmark 137 | public RTree deleteOneGreek() { 138 | return rtreeGreek.delete(entriesGreek06.get(100)); 139 | } 140 | 141 | @GenerateMicroBenchmark 142 | public RTree deleteOne1k() { 143 | return rtree1k.delete(entries1k06.get(100)); 144 | } 145 | 146 | @GenerateMicroBenchmark 147 | public RTree insertBatchGreek() { 148 | RTree tree = rtreeGreek; 149 | for (Entry entry: entriesGreek04) tree = tree.add(entry); 150 | return tree; 151 | } 152 | 153 | @GenerateMicroBenchmark 154 | public RTree insertBatch1k() { 155 | RTree tree = rtree1k; 156 | for (Entry entry: entries1k04) tree = tree.add(entry); 157 | return tree; 158 | } 159 | 160 | @GenerateMicroBenchmark 161 | public RTree deleteBatchGreek() { 162 | RTree tree = rtreeGreek; 163 | for (Entry entry: entriesGreek06) tree = tree.delete(entry); 164 | return tree; 165 | } 166 | 167 | @GenerateMicroBenchmark 168 | public RTree deleteBatch1k() { 169 | RTree tree = rtree1k; 170 | for (Entry entry: entries1k06) tree = tree.delete(entry); 171 | return tree; 172 | } 173 | 174 | @GenerateMicroBenchmark 175 | public void searchOneGreek() { 176 | rtreeGreek.search(Geometries.rectangle(40, 27.0, 40.5, 27.5)).subscribe(); 177 | } 178 | 179 | @GenerateMicroBenchmark 180 | public void searchOne1k() { 181 | rtree1k.search(Geometries.rectangle(500, 500, 630, 630)).subscribe(); 182 | } 183 | 184 | @GenerateMicroBenchmark 185 | public void searchOneBackpressureGreek() { 186 | rtreeGreek.search(Geometries.rectangle(40, 27.0, 40.5, 27.5)).take(1000).subscribe(); 187 | } 188 | 189 | @GenerateMicroBenchmark 190 | public void searchOneBackpressure1k() { 191 | rtree1k.search(Geometries.rectangle(500, 500, 630, 630)).take(600).subscribe(); 192 | } 193 | 194 | @GenerateMicroBenchmark 195 | public void searchNearestGreek() { 196 | rtreeGreek.nearest(Geometries.point(40.0, 27.0), 1, 300).subscribe(); 197 | } 198 | 199 | @GenerateMicroBenchmark 200 | public void searchNearest1k() { 201 | rtree1k.nearest(Geometries.point(500.0, 500.0), 10, 30).subscribe(); 202 | } 203 | 204 | } 205 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/STRFullRTree.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.RTree; 4 | import com.github.davidmoten.rtree.geometry.Point; 5 | import com.github.davidmoten.rtree.geometry.Rectangle; 6 | 7 | /** 8 | * Test on STR bulk loaded R*-tree with full nodes and various maximum children. 9 | */ 10 | public abstract class STRFullRTree extends RTreeBenchmark { 11 | abstract int maxChildren(); 12 | 13 | @Override 14 | RTree createOnGreek() { 15 | return RTree.maxChildren(maxChildren()).star().loadingFactor(1.0). create(entriesGreek06); 16 | } 17 | 18 | @Override 19 | RTree createOn1k() { 20 | return RTree.maxChildren(maxChildren()).star().loadingFactor(1.0). create(entries1k06); 21 | } 22 | 23 | 24 | public static class M4 extends STRFullRTree { 25 | @Override 26 | int maxChildren() { 27 | return 4; 28 | } 29 | } 30 | 31 | public static class M10 extends STRFullRTree { 32 | @Override 33 | int maxChildren() { 34 | return 10; 35 | } 36 | } 37 | 38 | public static class M32 extends STRFullRTree { 39 | @Override 40 | int maxChildren() { 41 | return 32; 42 | } 43 | } 44 | 45 | public static class M128 extends STRFullRTree { 46 | @Override 47 | int maxChildren() { 48 | return 128; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/github/ambling/rtreebenchmark/STRRTree.java: -------------------------------------------------------------------------------- 1 | package com.github.ambling.rtreebenchmark; 2 | 3 | import com.github.davidmoten.rtree.RTree; 4 | import com.github.davidmoten.rtree.geometry.Point; 5 | import com.github.davidmoten.rtree.geometry.Rectangle; 6 | 7 | /** 8 | * Test on STR bulk loaded R*-tree with various maximum children. 9 | */ 10 | public abstract class STRRTree extends RTreeBenchmark { 11 | abstract int maxChildren(); 12 | 13 | @Override 14 | RTree createOnGreek() { 15 | return RTree.maxChildren(maxChildren()).star(). create(entriesGreek06); 16 | } 17 | 18 | @Override 19 | RTree createOn1k() { 20 | return RTree.maxChildren(maxChildren()).star(). create(entries1k06); 21 | } 22 | 23 | 24 | public static class M4 extends STRRTree { 25 | @Override 26 | int maxChildren() { 27 | return 4; 28 | } 29 | } 30 | 31 | public static class M10 extends STRRTree { 32 | @Override 33 | int maxChildren() { 34 | return 10; 35 | } 36 | } 37 | 38 | public static class M32 extends STRRTree { 39 | @Override 40 | int maxChildren() { 41 | return 32; 42 | } 43 | } 44 | 45 | public static class M128 extends STRRTree { 46 | @Override 47 | int maxChildren() { 48 | return 128; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/resources/1000.txt: -------------------------------------------------------------------------------- 1 | 306.4172189289285 946.0362833946623 2 | 84.29629635460545 819.7830147974198 3 | 12.629678388301535 633.5304858641649 4 | 671.7081801020695 352.59717658642165 5 | 658.6980062859486 272.3190042364966 6 | 970.2808322434973 118.59966282377843 7 | 318.2826247304136 907.9386443596298 8 | 548.2079428801902 894.1206636814073 9 | 603.3965502494785 941.9365130367225 10 | 621.9625406848611 610.2651596690018 11 | 75.42705625361712 692.3050974927336 12 | 303.3025161650228 810.0502302780052 13 | 203.74296100361633 269.24115046211807 14 | 184.2821851879094 891.5847041280222 15 | 126.80055946438107 110.25315340101317 16 | 85.98384092306533 665.3976535882729 17 | 620.076036699284 707.1183507554654 18 | 86.72278339847017 708.1240153698748 19 | 355.81525999777085 26.9174650433488 20 | 266.76774537230665 230.10725787519792 21 | 751.506916727058 880.3510103598554 22 | 959.1582906775318 691.0802181250422 23 | 447.14843887564695 22.768601027026936 24 | 679.9892773156531 195.9375157813915 25 | 725.7881344757747 86.81821129689737 26 | 326.57199812674355 781.7135028235225 27 | 997.4917434781843 540.350019500113 28 | 678.1705722228401 67.23214580047521 29 | 803.7945242932595 739.1847060520632 30 | 711.5507095530563 378.49637442481963 31 | 667.8653827524763 801.5841144953339 32 | 752.3680461219749 385.7361729399127 33 | 515.0223218815206 469.7373956317542 34 | 23.461167921329462 492.1360706099625 35 | 318.90356579682475 343.303262778894 36 | 722.404558697739 699.614196587512 37 | 90.51235404920644 871.0250510831279 38 | 363.2148032376709 443.62716424242296 39 | 320.5172082660314 268.66211590733155 40 | 750.8932537010085 936.8260122553868 41 | 509.6040519344436 94.95738348140148 42 | 622.5270414443379 890.4899233174631 43 | 477.34050101241843 562.0877286475121 44 | 684.9590722442084 93.01691316998584 45 | 726.926071862145 783.0200777541206 46 | 506.5776411497357 216.35098882136316 47 | 261.3673579573145 65.42325437280394 48 | 479.56423630522903 394.0779599430135 49 | 896.0300120797427 50.26141105936976 50 | 858.9780370040215 569.0227260310223 51 | 293.18410663973395 962.9219997562097 52 | 706.3441823019573 343.5332090157226 53 | 656.0736577359492 495.7076149797963 54 | 417.95213419211063 82.237176376037 55 | 263.2044756898881 872.7476364287235 56 | 401.8596832667052 314.9097171026225 57 | 797.9594600355387 461.8621626651711 58 | 382.63661481097586 66.19125596638675 59 | 734.3134438399351 892.637101153367 60 | 759.1720194622012 599.2467386323823 61 | 876.3350917166845 15.946237042903654 62 | 418.4073272629094 202.05900124796617 63 | 517.3259525655394 197.38231745930102 64 | 416.64703282597446 67.90029849041723 65 | 583.8620008506823 375.53586670303986 66 | 980.1376033648004 25.62760474663961 67 | 560.6667116945229 35.78705421962836 68 | 347.8943662912496 860.7995049068758 69 | 954.1581867124046 751.2524267836155 70 | 82.29508175567734 235.21292960434758 71 | 545.6777929801746 224.75501686438116 72 | 606.7482970658921 760.3106879369682 73 | 709.821604009055 829.1625800587607 74 | 894.7830685670853 609.0114023301348 75 | 628.9593543564088 488.1657325814697 76 | 431.19635315881067 160.86576563025545 77 | 321.940516073117 365.54394577349626 78 | 793.4328872786733 567.0439352167252 79 | 23.150867875171954 238.1940644267625 80 | 460.1618316627134 794.5109456875822 81 | 597.4966743158423 616.6726980874863 82 | 744.0532263718254 662.8484574705491 83 | 357.55821639503137 646.7299976524645 84 | 67.04662414946239 622.5322019551759 85 | 861.0679649221382 576.2894934303964 86 | 148.9429888577699 540.0772802005527 87 | 10.033249710385217 104.55465983483026 88 | 63.940564544470725 553.3134472900803 89 | 47.23660124887774 243.3997423666098 90 | 534.7737044470663 139.15544963060233 91 | 851.5121561174416 415.9290169447033 92 | 280.40351857187204 896.5841774225718 93 | 270.1091229278783 393.0647072283343 94 | 710.747777468908 189.15642543952137 95 | 94.61875581867108 326.25131870063086 96 | 770.7264524886477 714.2122763817295 97 | 686.3544365977676 572.8394485654335 98 | 275.9390112867477 270.05115663718607 99 | 187.73882629271986 230.43980240326545 100 | 653.5777672546669 477.6985122406467 101 | 718.1662263212087 297.514168726242 102 | 604.721347042558 980.4872271568454 103 | 945.9720652203871 159.69657212861378 104 | 837.9411135050851 692.5291066514515 105 | 952.5558568529892 664.8148936613111 106 | 689.192324531459 996.2536443831921 107 | 360.3676148291405 394.3091848305846 108 | 139.25110013192398 399.54222892378834 109 | 283.3821648706778 864.7199295056339 110 | 467.49740420470266 54.588352578279434 111 | 776.8496265869001 300.14600179142735 112 | 539.6327616639901 713.465148294217 113 | 112.52432838857551 305.04826599929623 114 | 516.9613824312632 149.48387306146094 115 | 386.2389316686 236.50178481645034 116 | 596.1514878246008 808.7777833814728 117 | 676.603903992859 325.97617703758897 118 | 240.933314687504 473.1480264455764 119 | 216.77719926870842 632.9494242482538 120 | 250.97937731382103 13.059404826784027 121 | 815.6626468017415 726.1384064773619 122 | 928.2508435290447 888.77551876517 123 | 70.55977484308352 582.8544495602238 124 | 547.3842945115855 917.974341872902 125 | 750.2019420182231 572.9699734238204 126 | 314.23059188345894 969.78689231355 127 | 95.28345369347858 551.2082915609071 128 | 5.448105238470724 668.0531583083941 129 | 682.9905449356462 19.94502237744711 130 | 522.0906302766354 890.6910179052458 131 | 932.7154490332988 44.43674580333556 132 | 661.4199157850761 837.4254987081454 133 | 292.0462869002723 103.36868541002342 134 | 513.7113432553042 704.7272643022227 135 | 635.2898472008256 339.83956897801903 136 | 24.61103721593738 554.6607798239743 137 | 431.1987197625787 741.3788660371735 138 | 428.6408153772714 793.4439164011834 139 | 792.2376228939942 622.3179484563194 140 | 455.7375364118353 785.8731143208222 141 | 604.6383637720709 407.81317434892514 142 | 440.25126319754 523.3685532372212 143 | 556.6567678632639 126.04556069608464 144 | 720.6169542953907 936.2466193606846 145 | 31.85901735724905 203.59833284764517 146 | 7.952477159667515 394.92738208424583 147 | 514.928523980281 128.73998102799965 148 | 723.1251644625178 180.13740037219063 149 | 369.3995015506817 298.31748372051635 150 | 654.3686582595071 218.76891933248632 151 | 589.8859984473874 896.1901977874344 152 | 671.3197216966294 179.90839976090533 153 | 405.7908579165671 964.6121731035324 154 | 646.3849933702918 104.649081478714 155 | 419.14157674877106 924.696896452699 156 | 180.63600886429188 103.65342325000215 157 | 296.1154248948037 678.0748677472731 158 | 208.9698847096325 298.03326317400325 159 | 899.9792397449611 79.08151262364682 160 | 68.06247951515942 101.96661556276531 161 | 152.58398278229933 5.288638080400476 162 | 150.67957221816118 149.57217509203392 163 | 842.2180291481046 473.92038422540514 164 | 841.2009247052753 653.9135714767019 165 | 57.53713149522266 252.66987053172386 166 | 29.75089296703515 752.6073538388773 167 | 920.4530583523726 195.66032214614526 168 | 136.1184860496636 442.3603018066575 169 | 815.2773968067315 98.77060585386843 170 | 239.6888791111297 33.86270688533721 171 | 367.08009679009876 213.27163912102333 172 | 607.8972764680733 668.8165160181973 173 | 9.137923730073494 682.6966270797167 174 | 643.255109868493 332.4783549200766 175 | 97.51011733741166 75.09521684152665 176 | 27.788010254833353 967.9490759501974 177 | 180.19452841307992 871.2972754564677 178 | 633.7631688655981 752.5430824505355 179 | 208.9801404137731 239.53947973900569 180 | 590.8739584220964 331.92235801939177 181 | 194.02678094943104 677.7837661889967 182 | 752.5875917155449 824.2814429830364 183 | 44.366399220734046 137.28381816871783 184 | 688.1514148805929 704.7213560340748 185 | 111.93479361516545 54.43184077632801 186 | 241.79236459610487 259.05198607127255 187 | 262.40622681954164 312.6446647192947 188 | 646.9327584391749 156.61398631822544 189 | 133.0178861247142 532.0251030898083 190 | 160.78530654069567 833.312764323285 191 | 605.734950263235 241.76022248157446 192 | 193.47872087036257 798.9088668575075 193 | 423.52118401674 428.69552417730705 194 | 945.9046569795005 686.7103566881269 195 | 308.14388700905636 675.2505034871256 196 | 641.7657895609864 849.164652188801 197 | 899.8565527320628 600.8169041484858 198 | 541.8438361653684 569.4486480687049 199 | 332.46582568436247 603.0086388975025 200 | 62.29515382945583 507.0073969103954 201 | 281.7042736712382 958.6079772911395 202 | 483.82116940829076 824.0937282418681 203 | 880.4941534870896 188.7797093726259 204 | 934.8493841990697 550.711917775791 205 | 981.6012165935601 219.10123934629277 206 | 559.4001478723155 136.97099367004185 207 | 866.34206444802 272.183511684745 208 | 39.10314195019371 814.7037986115931 209 | 647.4224287351146 619.1336690019975 210 | 928.8670392104375 344.31080773489543 211 | 294.647779867906 285.83745785230894 212 | 586.9941156912957 958.1377770544467 213 | 424.1617683477843 561.0157131061534 214 | 833.0717560674542 828.299004143017 215 | 735.0322673107624 685.2356577817577 216 | 850.7604748210882 184.70925420504346 217 | 251.41827206883437 413.5347598123634 218 | 267.6385051536809 288.1883133626034 219 | 334.21576944599497 239.0408063746522 220 | 790.5511036769904 823.8549269644699 221 | 762.9941892967835 940.9492828946335 222 | 252.4521174689338 921.6271682044924 223 | 57.19911503061348 777.4447249224771 224 | 435.5147199776459 933.4987402585464 225 | 605.0113208291255 82.63006770943959 226 | 575.3266047314169 301.36199075828506 227 | 98.91623508290614 246.25418519711917 228 | 22.274506433159978 334.49958359851706 229 | 238.9513639696068 56.00448597413599 230 | 138.76213316356566 482.46931993933873 231 | 657.7642961230813 164.3579182134166 232 | 144.69388974420937 736.9568621285174 233 | 546.0270578228193 5.460431005903987 234 | 288.6966393145165 125.27391911028319 235 | 512.4172700352208 832.2313541153957 236 | 418.84041623865863 868.5301952448248 237 | 799.2900917541325 669.865828436151 238 | 754.1581375102239 669.1091857799345 239 | 93.32965789985847 889.1350473166563 240 | 417.05338071857824 764.9296933122848 241 | 819.8820119391813 791.3602073846874 242 | 76.72441299747213 842.0761295031313 243 | 990.3362991102374 66.66340040174568 244 | 875.0218373913285 632.7326259786627 245 | 383.8345285651895 238.07443337310917 246 | 658.6959194048038 41.9570537198517 247 | 87.75463294426866 236.29960366608083 248 | 425.7791337453475 944.6832231849565 249 | 195.82531704731053 63.43499110416162 250 | 808.888343618616 373.4403790204913 251 | 768.3956344778906 98.63315793209826 252 | 364.5200225495987 677.6315341311314 253 | 996.2956934705269 974.7089407382576 254 | 414.95109628169956 376.8126914215945 255 | 877.8897845612696 111.89636690576832 256 | 198.14705163086288 853.2677202168593 257 | 618.3363395766761 933.4457793317331 258 | 121.11793024215078 733.2742519732425 259 | 390.73412438019085 507.47578673154504 260 | 983.4519662328636 791.8080126905311 261 | 60.747315946110604 860.4726812452981 262 | 140.2957886977414 482.0345206689729 263 | 969.4667915769766 490.05508606511086 264 | 707.8387416550224 738.7885843662552 265 | 893.6786802545943 668.09911821927 266 | 79.39856965141156 534.3434466916888 267 | 858.3752896189624 970.0455799934717 268 | 216.49430134980318 775.1234841857196 269 | 563.2579120020384 92.18713175837168 270 | 406.8314241352354 519.615145021661 271 | 803.1445819150633 425.96039193286083 272 | 439.9133221095999 170.5832043596005 273 | 411.61036373613103 46.74374281041849 274 | 441.03249088536 248.80030003595022 275 | 937.8515082376172 744.38905072639 276 | 925.6832336761936 590.8497233915901 277 | 478.67911153081764 473.6914510067111 278 | 988.9778115851377 330.1629400992917 279 | 830.7116224006216 135.22808219113503 280 | 928.4357026450251 818.3044233563705 281 | 402.250283181656 910.473300997879 282 | 13.555994082826373 722.6186911855701 283 | 129.9846134754208 469.8243948860157 284 | 561.8709389653035 896.7053729351192 285 | 982.5902592297437 248.14850540589373 286 | 958.7186135702351 261.78999706773754 287 | 501.4447298699286 639.687563242537 288 | 766.7609435448487 859.9098157863302 289 | 228.1009370349505 402.63537759747805 290 | 611.3129414804355 443.9350490368528 291 | 798.8225399157955 783.4269659141462 292 | 98.83804271126483 454.79845261308174 293 | 948.399236943318 871.7569901049253 294 | 628.5028803322028 2.906411876991255 295 | 658.6238149902537 479.57059029143113 296 | 590.4749397970518 518.5575576702112 297 | 211.2273313419998 400.74682598961664 298 | 109.68455271827938 65.29569417593551 299 | 960.7324872152418 252.92114066394456 300 | 190.06245823690128 920.4753318080141 301 | 229.59952977744646 228.869786820184 302 | 841.8028920517005 918.9205849745226 303 | 846.2031324844122 992.1062237229809 304 | 532.9913629069731 228.40848064186326 305 | 495.5922785784675 639.815310470548 306 | 96.97522878185671 679.8103291630742 307 | 233.65005752049439 125.97846495292431 308 | 48.14441174265915 510.07577012165194 309 | 227.18354343599844 788.5187149184177 310 | 111.32833145324794 392.8460455841725 311 | 25.638538571165938 656.5220539340153 312 | 653.8048381001145 929.3341830120098 313 | 444.54769810508145 27.06699225825848 314 | 623.9550080773048 351.21198260195155 315 | 446.4848657628094 395.92192228144063 316 | 546.8877511741899 47.59439130429155 317 | 242.21223983495122 202.34537027499155 318 | 104.8966303326887 669.8142864605201 319 | 202.87132931617447 5.451672263983021 320 | 839.4003494642425 990.531637457863 321 | 73.48252174795789 648.0806795279176 322 | 551.0578425266409 397.82296740975033 323 | 408.68228755326084 683.8366460916538 324 | 46.03751655684185 890.2482105004657 325 | 113.54091963076863 843.9382679742203 326 | 978.9595272601425 705.4940189006616 327 | 465.46793718718294 602.7483805754109 328 | 676.8188953825282 263.0439004578252 329 | 17.62645199522561 964.3280316949646 330 | 993.2365057962985 930.4272481687638 331 | 339.9414415365902 437.086635982711 332 | 438.6737196429957 232.95057988938206 333 | 640.7013081252036 789.5763559070128 334 | 59.78600782180277 518.4165872430727 335 | 929.9162234209213 587.7052065390959 336 | 799.879520917596 761.1871544392789 337 | 535.0103104174274 702.1201085184745 338 | 362.4734705572826 144.04894188806182 339 | 460.0894434565136 944.2379472687212 340 | 921.261340322828 291.69127704864326 341 | 291.93989239246145 740.378563989703 342 | 372.3013964325783 546.20765461227 343 | 99.07776270469004 285.681038359512 344 | 208.05727266106322 472.88388147378436 345 | 44.58241751815517 932.9601820684176 346 | 507.94816455887957 863.6372278466937 347 | 239.11199898771264 666.3879589987557 348 | 986.3567409641738 865.8229074046004 349 | 697.4125170793056 385.8597540825124 350 | 516.5826071701629 505.7251524586864 351 | 129.7965448557248 385.1331695130781 352 | 58.01788816185815 798.9024441911707 353 | 699.4813094887227 845.3027594027469 354 | 453.8605384606953 843.6573610446238 355 | 807.3401192676703 384.90105571499646 356 | 137.97013360304356 779.2535239117949 357 | 427.53517182287857 708.8928396396495 358 | 392.0099485113003 257.1034566408602 359 | 510.663862530341 181.05602253128694 360 | 427.80827370957894 121.00279824103688 361 | 495.4647546139729 707.7188234048964 362 | 234.91065485037822 321.5879606247546 363 | 25.7931751951892 665.550402574071 364 | 829.5843458539517 700.5454863132276 365 | 556.4911267484318 732.0773209602055 366 | 269.07483376973664 171.70382730283885 367 | 649.9394371169244 384.8260592792754 368 | 553.7034931792111 998.9885374673385 369 | 414.4948234600606 523.4674631450413 370 | 329.43478273476546 325.3245807166154 371 | 716.678074428757 139.06610440421306 372 | 124.83001219992728 841.920627036683 373 | 510.8942148812884 205.51376665326526 374 | 708.8439709305635 503.97113489854127 375 | 873.628820065668 0.4530490931913267 376 | 39.70999226572325 496.6650259269011 377 | 103.47949713194893 876.4735286866731 378 | 190.1976473271657 234.4896307569452 379 | 554.0449112620436 98.08945812560977 380 | 580.816691473307 37.171567264914884 381 | 703.6084328363916 735.9848448142664 382 | 830.0796370001817 267.19673080204495 383 | 333.71703240215555 767.2375383141626 384 | 539.7249016463462 136.70407123727657 385 | 588.170269708236 468.71173502158206 386 | 372.84082768019624 95.64828020871718 387 | 114.59860508879427 910.533678513542 388 | 854.1205438266619 698.4794141476914 389 | 452.7237927302138 857.5424345260262 390 | 424.01640195033355 113.18773817528272 391 | 326.5584498753693 668.8345286694513 392 | 412.35184375363167 984.4145506580754 393 | 522.2161546352444 848.9970139675715 394 | 761.9875480333355 191.43086176866896 395 | 588.66705644834 749.3505832142596 396 | 529.4281127084399 152.13759328654132 397 | 685.6883433586418 543.501048652435 398 | 416.7939520789169 715.8423682123745 399 | 521.4229560918649 8.723535864143205 400 | 848.37275887155 360.4194592923515 401 | 471.373849211215 833.1808830609069 402 | 395.00366170951384 363.56142288604843 403 | 651.3252469570186 138.70384051061825 404 | 670.8363087008734 853.1820176578755 405 | 928.5965618065097 659.8374710672695 406 | 179.54610964512864 158.63170134485182 407 | 599.1983859878559 552.0846782060893 408 | 970.8761305342388 682.2391792423654 409 | 732.8742583262792 115.75437533587896 410 | 383.4148946159684 589.7925820547688 411 | 993.6759164248583 816.5482508462557 412 | 595.8087814846658 978.9273322041657 413 | 80.63388452078613 859.9967200768333 414 | 186.14633935157886 825.9876130328084 415 | 801.2490137700476 234.08127955183323 416 | 408.04139416056427 934.7809175656589 417 | 189.94505708324627 572.8569860991037 418 | 431.9803110964595 314.7464887132967 419 | 14.286228561655733 413.6153079774685 420 | 371.7884042589755 901.4097779855607 421 | 473.6775939142488 421.10412196958924 422 | 518.6092573856401 298.5968962960405 423 | 888.4306441187642 934.5485171869506 424 | 838.5796108808815 269.7345290982821 425 | 701.4898659939087 756.692016678163 426 | 455.42205428891134 34.6622369295605 427 | 170.7808350543819 448.8050919068509 428 | 535.4661611893406 38.73584887749659 429 | 717.0538593339738 521.5838001665868 430 | 720.1485229996401 752.6017970520151 431 | 10.26161374937562 819.0884052134418 432 | 9.8303991054145 233.87444847368656 433 | 526.9232415387452 81.3480543742705 434 | 792.811323735576 636.0493677924305 435 | 491.5911219490784 140.98436693882843 436 | 534.7060728050944 585.3374933229397 437 | 827.4510143510238 460.1832744988794 438 | 495.89097106886624 362.706656786861 439 | 984.2502323232443 746.5710165866308 440 | 728.5150716801905 126.26805171225396 441 | 286.16226440098245 200.0267748834742 442 | 519.6106722021059 988.2477361812536 443 | 747.8607202936304 537.1908774065035 444 | 393.1266436340114 621.1335705666196 445 | 143.98925663585038 316.404386678771 446 | 761.2469483744802 209.19081902157654 447 | 485.3784019378722 243.04195125215168 448 | 324.1461052903994 984.3900226983637 449 | 954.77418148263 73.67700013117128 450 | 357.3723907375357 289.89351094544156 451 | 785.5073480966427 457.244027334329 452 | 97.33827328063826 99.5973602055753 453 | 528.4464351432854 552.3404849096652 454 | 537.9368908642462 188.82789643099883 455 | 645.7415865596025 542.0360876359226 456 | 85.09278564898493 699.1432088327399 457 | 394.28037737397426 231.03494446471095 458 | 681.0933321524644 669.2915841655981 459 | 517.4406483262895 754.7616385628055 460 | 206.8371003348888 214.73047523330456 461 | 350.6400214646666 55.919800579290914 462 | 197.67429835326166 429.7111378452173 463 | 564.3448408262309 191.2975057284032 464 | 167.30321473498356 758.7855560781436 465 | 917.6165933201421 720.0707907651152 466 | 124.22585254046848 538.693994615411 467 | 75.93673075429896 394.58309280900596 468 | 186.55510774754615 646.9430221153208 469 | 758.9656155243872 125.55512879501596 470 | 553.5047117839244 709.9851708049107 471 | 227.05527819913783 725.9057233241622 472 | 475.6823150031617 121.76341397105462 473 | 389.7494011353162 250.8413804110804 474 | 281.3450571072633 202.48492421785392 475 | 625.1684267178473 846.5986862995738 476 | 962.0663779139671 187.839970643218 477 | 736.0914268273252 896.1997308048585 478 | 298.8011773328703 380.48388870261095 479 | 336.71070279346003 907.8081783615326 480 | 18.126374457334226 718.450994532505 481 | 363.4488203058918 29.749411976032203 482 | 8.47229815354833 219.27155969054357 483 | 333.89215831962093 295.9851895256159 484 | 197.4496092246948 243.91374101782105 485 | 439.80906653327656 706.8094359524582 486 | 293.9157726817886 291.2746985767297 487 | 553.3844868426874 31.758935010611445 488 | 232.21375260775324 81.7961862437403 489 | 750.2173688552195 785.2085600623658 490 | 821.054887958632 17.88161659237253 491 | 8.291042086430721 169.84772387819692 492 | 795.8069611382057 719.143119920133 493 | 329.0407472159431 909.2111592328417 494 | 200.48754562940584 222.1089134915114 495 | 644.8067012482655 797.6636954659916 496 | 784.5516951585056 606.8724474152273 497 | 526.3752424961298 484.7150730664165 498 | 889.6021234223857 267.266683855814 499 | 884.9740110195452 480.26781360340465 500 | 122.43911601708324 776.4983342067242 501 | 575.0024656233797 618.3774842716952 502 | 963.4066042743128 316.77846086626613 503 | 46.94158117059166 249.33096098203123 504 | 342.7795927010429 939.3371589286171 505 | 974.3017189287845 243.32555930151756 506 | 132.9774660033326 500.31224562166375 507 | 84.13142442331801 483.75781424266285 508 | 450.6764757712289 978.352557901045 509 | 257.52377193692877 904.107557597305 510 | 640.4343960215414 21.378824797496087 511 | 334.72105098992023 279.629528415179 512 | 820.2283481377183 992.7960861743773 513 | 958.8329437460515 923.5410583366927 514 | 909.3470781185492 491.5535980652592 515 | 222.84681533482097 157.12144188680932 516 | 130.3668881888862 305.7993532917637 517 | 846.5233730200022 924.1143463592283 518 | 79.48045108437097 26.478244725655408 519 | 102.93470351795064 202.0522254158038 520 | 593.2360838033302 95.07415135076802 521 | 738.8158222749177 926.597255989952 522 | 804.7845446420239 888.7982647112027 523 | 688.5648575108729 989.7205895084535 524 | 979.0192547549607 556.8767092398008 525 | 468.64139667115734 498.51787951408477 526 | 943.5351657982719 713.1931033913223 527 | 757.2759279862938 888.6858619177897 528 | 191.12006162479966 763.3923894642927 529 | 813.8182483219392 675.1610441418685 530 | 19.531831655538955 598.6544557511725 531 | 72.71575313813572 592.1485421313234 532 | 395.6037426629592 623.6970433947112 533 | 459.02763887863273 625.7451057778195 534 | 583.2589312207895 603.1696903452938 535 | 715.5442985705238 974.5874500799587 536 | 958.8048684730487 608.4512593949761 537 | 305.9955580640227 287.4332838084008 538 | 851.9166091119439 425.965981146755 539 | 264.4955867808646 621.3091810546686 540 | 697.0079379188712 148.48371221279487 541 | 698.2861740559524 439.8356307369592 542 | 257.22749525866016 312.47208024228433 543 | 519.0042010980754 628.5666852287429 544 | 192.1067847506901 867.4200790584724 545 | 377.113276139757 942.6579279351594 546 | 779.9255872335339 467.1532822411707 547 | 704.8032639645003 521.9027061239415 548 | 177.1494983305384 58.51348488455588 549 | 234.57614199408627 109.15396641820962 550 | 199.83352106925668 509.3764015897115 551 | 353.89973519288907 390.37468035152165 552 | 245.67453738120747 65.83287523764547 553 | 180.72593787446556 438.03715373582287 554 | 640.4344105379157 757.4607085397645 555 | 300.3334010957545 584.317347056535 556 | 388.74492640290316 479.9655697673736 557 | 690.8688828935185 176.50791333678774 558 | 36.84457270436037 376.0711457742778 559 | 483.1258397027396 574.2989168877248 560 | 113.58616152814183 308.39026810401225 561 | 849.5124868278733 437.0530186647709 562 | 406.09353579665594 672.1101216156463 563 | 497.82562120460096 818.9276077149598 564 | 147.734603700165 530.6766047275219 565 | 957.361219310549 840.6732314856771 566 | 48.61711821432857 74.26398575292892 567 | 88.0557680691183 739.1644192682805 568 | 982.6022169134444 698.6677853098189 569 | 17.767554760395154 909.1952302419954 570 | 59.870518609804634 581.360684579452 571 | 18.470128848307787 146.7984994350774 572 | 760.3641239277503 491.8021701850785 573 | 669.0450563811809 679.3245332105845 574 | 780.9669301922667 714.6946201204481 575 | 20.524578363542933 724.7413543690843 576 | 258.0751575693211 387.73041938623686 577 | 379.04927221855877 261.0951116866825 578 | 67.24850743061994 259.47500847657636 579 | 752.4694077153131 406.7961880924845 580 | 972.9217384695778 858.3842809693438 581 | 968.4332332673678 313.37245012465974 582 | 503.69565279020765 330.55408213794215 583 | 964.9691967838382 754.5586013930712 584 | 562.5150859915644 751.6532272820015 585 | 778.9832148587881 659.0659496239742 586 | 946.0809375899104 547.5913203357524 587 | 313.75630169926796 679.104809037886 588 | 144.13232416255684 768.8253412725035 589 | 53.44158857272119 512.7070666123991 590 | 16.77378107645644 354.80999963215845 591 | 510.7244213110383 105.12382117211739 592 | 206.81158622057183 197.94850103371587 593 | 343.2225376636127 43.04947799575487 594 | 434.10252217754606 770.5021520578778 595 | 754.8681888706021 425.1496063636524 596 | 140.20726981128385 313.2683317335427 597 | 10.427262079415911 243.34747836170013 598 | 304.17961314984655 101.43846886730489 599 | 634.4753796169708 841.5496896126402 600 | 634.1119562250127 100.89893587311416 601 | 140.56452801830187 331.9687142422973 602 | 754.0965621328769 407.3391105608315 603 | 941.9776283252247 943.9262549405288 604 | 452.55089984113306 220.88299768440754 605 | 432.3832849603595 155.99784100251958 606 | 535.3947338044521 750.5618643865404 607 | 92.86621025452435 119.58624313083466 608 | 336.3556533236315 365.7970863439273 609 | 881.2231976683122 320.4869614902545 610 | 476.71832967490104 516.1638856424743 611 | 90.07898072145626 644.7364024773975 612 | 38.12290609851476 426.0586718577667 613 | 322.28948081836785 16.00942456439103 614 | 914.5556050616619 337.49311381435587 615 | 225.26482556956907 554.0597458594784 616 | 743.4648706887994 122.09119238473754 617 | 150.25836804296588 767.1730736045432 618 | 480.9748752494705 412.46572652983093 619 | 958.3315911010639 636.3296327697723 620 | 382.45725718488 13.503053553540978 621 | 781.6194167820254 574.7490984359017 622 | 877.2613306248402 245.6860576402372 623 | 666.6842108199451 153.7175943385678 624 | 585.1915653067806 45.4372040144696 625 | 676.1607795587809 174.07303525818662 626 | 512.3609674208901 101.56481341974899 627 | 205.55888579388372 132.45145525625168 628 | 285.3372202460234 42.24735404612978 629 | 984.0038591436463 382.3738966488357 630 | 135.0379146315409 703.5922143585755 631 | 470.85971560913686 322.4795353612645 632 | 225.62058721742483 808.6569524664512 633 | 134.59357507974278 757.6877303602428 634 | 838.6513966759095 964.9221871127066 635 | 405.904031606545 173.7977008625412 636 | 869.1265473707462 748.557636868984 637 | 934.0502790539203 42.01199876311379 638 | 67.4585304155355 785.423690194502 639 | 143.48271761424246 427.0951299199302 640 | 470.32908139663954 161.6026987390453 641 | 987.2900010723242 111.35690629240102 642 | 503.3493674686247 200.3557822543528 643 | 224.64161340291076 166.37513786853097 644 | 309.757191677331 627.7525392410378 645 | 511.31869884588764 405.349865582207 646 | 961.9201345547818 415.8223153720381 647 | 85.59050214604625 431.2074856039887 648 | 346.20222933686864 139.92784349601328 649 | 856.1073786093169 59.0495798234062 650 | 676.7912988812562 516.1627653504574 651 | 254.14569515468588 736.2682109408801 652 | 790.3730240966048 894.9270393588748 653 | 299.4537821306923 209.62568616121723 654 | 601.0763740512697 878.4352080902314 655 | 947.1124842010645 95.82326490019832 656 | 353.90506955525444 902.7640143834484 657 | 932.2373069695731 200.56048982053775 658 | 604.9078476362886 579.1480359942378 659 | 10.014048395353136 400.81229821187827 660 | 177.62985632539375 824.5826793365594 661 | 700.4731453133758 656.028920040788 662 | 697.9266301805511 328.39629682070506 663 | 390.5724675317603 246.18884273546195 664 | 693.0107919102569 699.304240190636 665 | 920.5720774819142 648.1128724296279 666 | 655.6410118989385 716.5591371752231 667 | 587.3487194407932 556.172942512205 668 | 920.651807203275 469.16384891236254 669 | 834.2119724850947 429.50635938993764 670 | 678.561474682436 808.7144640282901 671 | 764.9474250226651 605.0727995266918 672 | 959.7850363401511 464.2924726251607 673 | 19.227424273077666 454.367551273036 674 | 963.0177405530472 371.9272244923684 675 | 477.1927938155554 281.3314367371911 676 | 672.6437517423025 256.5005099019928 677 | 722.9237772295712 659.9741671654341 678 | 312.56415831324426 270.5674992014575 679 | 189.6822564800248 692.4546677813414 680 | 817.6267101134644 542.4193439435519 681 | 434.22150016099283 231.8381713022265 682 | 168.87963816846508 814.814459349866 683 | 43.12336533536143 458.4767707971684 684 | 135.1602923939632 966.1569814187214 685 | 261.0375870152583 324.93636067428656 686 | 691.0686011461914 97.50276271280201 687 | 548.8610677273533 291.61989499570205 688 | 140.16473499548587 41.62418278920976 689 | 929.3099659346756 463.71276256946646 690 | 762.2689221221171 604.4674908595297 691 | 158.00083650571062 709.8036346781 692 | 625.0305894516905 584.6871509388511 693 | 470.07118509477 593.5094201643886 694 | 52.47340033216841 633.5437334951306 695 | 895.5344569168325 981.6609855980596 696 | 127.01144703716771 315.30325098470826 697 | 910.9776177038382 6.081477456447049 698 | 516.4706989279798 307.37736172587637 699 | 500.8744086755563 650.7167830862967 700 | 863.9398179987359 539.7957610352399 701 | 538.7007004842203 611.85320870783 702 | 955.8122651028493 215.20299932670085 703 | 766.2032178384908 236.38509760819636 704 | 892.1717474661633 73.42420872905619 705 | 548.5859637223448 281.5707174266703 706 | 523.711388412611 968.7455028377801 707 | 14.043933309407342 959.4416797208326 708 | 490.6666777066924 813.4061368573314 709 | 147.98652367072984 230.00815122280892 710 | 301.7805735423219 207.40139915296652 711 | 905.4581845556794 589.6277140336243 712 | 25.109010508384767 622.5469646621082 713 | 429.67717536860806 664.3832693219869 714 | 327.51357140771853 837.8560922381798 715 | 20.277804002888256 763.0412796126294 716 | 795.9771864526706 433.6339445757543 717 | 581.7552425742932 170.1386353812462 718 | 701.4182671940786 543.2935782151504 719 | 900.776433433683 366.97256036590676 720 | 624.4669360267948 734.7505606188382 721 | 250.43440483234602 556.7449801945105 722 | 652.7068064743488 847.3545624050021 723 | 500.18732882601324 839.8391655970455 724 | 180.17469069989878 845.667479980397 725 | 122.13806815058791 136.18265675383955 726 | 692.4489568434971 267.99951640139 727 | 227.47362649462656 483.87787993577336 728 | 304.4476077477527 645.4665306577307 729 | 41.29811933041094 656.7575161884897 730 | 233.09509366153048 346.4325166136233 731 | 29.757203014565082 138.24886755661626 732 | 833.3062193016196 661.5538390314398 733 | 230.26545906207895 364.90771564314116 734 | 303.2752320252317 586.2426035151599 735 | 203.81265256087323 810.2088957636797 736 | 673.8461221533644 680.218294779034 737 | 427.73884673246187 917.6572874285262 738 | 236.78009868028306 587.9186445989345 739 | 878.0322533729305 112.00949109381774 740 | 138.0250093649288 288.8917526743113 741 | 12.117803856389386 118.3730326598813 742 | 464.6304201246726 913.893777173236 743 | 356.2685736374911 601.1765557633548 744 | 787.7410802346799 10.267056719452384 745 | 426.18620593661063 698.4808741902639 746 | 789.1411135190459 469.2761814093954 747 | 764.9605363447802 371.8275140728193 748 | 295.10931593326416 938.430318508765 749 | 469.53264493967475 617.7978818768653 750 | 768.8862362799308 433.4219244988741 751 | 694.9497051704373 494.6824197373073 752 | 71.84163500973384 37.16360232625271 753 | 275.1139761258816 606.1364402634908 754 | 93.47094138724677 27.506410264175774 755 | 779.3924991789489 153.42495219590302 756 | 671.6374384323212 510.57418810562285 757 | 36.36793025494056 918.8363023307608 758 | 77.01704679066445 653.25062956659 759 | 399.17504624729526 575.0699936380951 760 | 219.49056581520566 906.2067659205803 761 | 801.2816444897417 528.8815879930668 762 | 649.2681008677773 187.9584403813832 763 | 957.2365841701286 101.9936328442297 764 | 371.8190458357804 860.7949044973795 765 | 899.8216130402684 228.25798670610308 766 | 473.2202319436871 471.02109523518965 767 | 413.20791817953506 3.282086412263019 768 | 561.3238040547948 648.807767437867 769 | 821.1320822334089 361.2074091285193 770 | 68.18541633360364 267.0453566349261 771 | 19.770940698243034 873.0558081509479 772 | 530.4827036932986 943.9486208106673 773 | 606.9074879082417 162.0354589602243 774 | 67.19273021174365 240.761336226595 775 | 452.1458040157154 713.4246588135276 776 | 407.58601552353844 453.7610983481607 777 | 77.34556494178247 920.1286942294047 778 | 987.6346295500616 728.8664504673668 779 | 772.1114909356698 49.73105515258391 780 | 829.2196849771522 337.4998349621317 781 | 456.08725579599053 444.83741422923794 782 | 144.06384578184006 343.9615763952395 783 | 917.9666050524639 675.7366649963077 784 | 863.1025894853601 567.4213677605125 785 | 210.54978712070005 552.8805017921087 786 | 582.047516750576 695.7358375325701 787 | 661.8361629577888 876.4093214576795 788 | 735.1840274946276 643.6516694089395 789 | 174.05885503875874 550.9284668842383 790 | 161.98456528228812 764.5560066502288 791 | 225.7309343636281 225.966311572696 792 | 614.9077588323674 322.7867122084478 793 | 266.1865936218456 936.0209753393808 794 | 171.79299709574235 712.6172460013115 795 | 997.7654179167314 308.8302430925498 796 | 962.5488006132568 270.3821073580543 797 | 377.7011107210568 786.4750459673941 798 | 97.37272060679014 167.81070236458774 799 | 39.94076772255817 961.1536372753227 800 | 192.5291120962186 797.4882103229775 801 | 236.53442212292364 565.9403116150512 802 | 429.7507317046704 265.4650872885498 803 | 328.8989893219418 880.5688313817058 804 | 656.618693057608 91.3867591289823 805 | 321.17442663391995 313.25744545851455 806 | 637.8146460360772 983.1177524256586 807 | 921.0543997634625 701.8190481476636 808 | 200.92811733194904 600.6856376692762 809 | 137.88747739264284 440.7760810496084 810 | 685.5407736743365 553.4718315541113 811 | 483.50896108742234 885.9272233891405 812 | 800.5987802165969 484.9275849752854 813 | 428.17795942252377 613.7884242528648 814 | 722.6231284914237 990.695786191167 815 | 882.1575191173163 20.558456462302033 816 | 26.09720176664021 288.86949469180104 817 | 122.89073582025767 433.73481854025084 818 | 827.4096043630692 15.221397404138525 819 | 768.3890427846284 379.23283119660425 820 | 345.01958272003105 251.58817786188814 821 | 109.36298435151825 897.8376480450676 822 | 931.0514199520405 912.1965928771477 823 | 355.79061858916504 837.044375166636 824 | 513.3128582217091 910.5692407126276 825 | 128.03157742178973 857.8196237750908 826 | 301.7723547724924 108.74920399381605 827 | 828.2599154411467 490.54270375435215 828 | 559.8184088338053 910.9349877999891 829 | 364.9023558305281 950.3627703312197 830 | 218.16364731247273 505.2181388515385 831 | 70.93267332159247 579.4334819460886 832 | 118.04502417797814 179.96780103822607 833 | 556.2873673200971 721.9644193020233 834 | 710.4112790831535 845.5080436157674 835 | 665.3312960856657 557.7540491503038 836 | 109.0768242115543 877.085106137768 837 | 672.2164724817555 920.8464894275482 838 | 498.36138871200455 661.7236773596355 839 | 340.1410049879718 412.18028782637407 840 | 29.522860143394002 779.4223397240994 841 | 494.9294709865282 178.57411383361898 842 | 505.3305175967364 578.240482579278 843 | 319.0196556062146 575.1211482656093 844 | 348.4144799707637 13.18000630985705 845 | 658.8552028573002 554.0400359910233 846 | 576.5665727982628 10.367226352892335 847 | 256.8473990707215 30.25708167817365 848 | 766.9565771461105 290.8912160408943 849 | 968.4834573750023 662.4710954711366 850 | 281.2670671284756 542.7574104007351 851 | 705.8227000581785 458.1784288486266 852 | 345.0392022357892 64.76577003680173 853 | 60.53639020438628 362.11272596347777 854 | 927.060589166311 522.7252579588701 855 | 302.81055718095394 519.7802623829289 856 | 748.415648629059 256.2672811041804 857 | 726.8454973990955 221.24812190287724 858 | 165.85802590499478 653.622878866315 859 | 119.34975860532293 625.0697968648553 860 | 120.4532611913991 472.0793891925774 861 | 464.340302979146 238.20798872116745 862 | 819.9795876214921 623.4346219440821 863 | 865.7246832538407 785.0426637789811 864 | 332.3632502838163 866.6173433045415 865 | 68.55517381897135 537.0273170042415 866 | 807.4640459123453 53.745089405886844 867 | 890.5086368873706 394.28426237573234 868 | 615.815886702064 61.24140411048118 869 | 337.0604855943756 11.40543084551604 870 | 295.466212135178 304.2367553237949 871 | 166.98441968653134 41.952416280441994 872 | 831.8469352743491 780.3279739013334 873 | 199.22432255854417 139.62538559819427 874 | 460.64913425527675 917.873804449615 875 | 707.8486005380046 698.7977332864168 876 | 879.9621422557045 114.35490067914344 877 | 838.7109125437178 443.0892707911712 878 | 485.4772703045286 741.9281259647231 879 | 99.60593225295045 877.877801276409 880 | 1.3454926965713598 570.15740691095 881 | 625.1223152348082 311.125262442977 882 | 669.3165874609002 10.003877293454977 883 | 98.05961551316777 616.6212377328867 884 | 980.0778815604132 318.51041174324047 885 | 921.1892298354296 164.72304759382595 886 | 783.2481057260597 920.2168729277134 887 | 476.304359862309 377.89852299362246 888 | 496.2722053405524 299.19391326920606 889 | 81.91749232669088 181.85377076397302 890 | 47.50123009009955 494.68498242993064 891 | 566.6278973837228 217.75506101828634 892 | 135.03113797143905 93.69749021870976 893 | 212.09635940722228 57.030447155609785 894 | 360.4126972569627 755.4858149137746 895 | 187.7274876003 817.4632115580483 896 | 805.1342012815703 725.7202394859037 897 | 498.57484384097484 517.7657448151416 898 | 657.8179055026271 502.2378518179959 899 | 898.6476876360864 227.54950490367963 900 | 571.3596412746317 799.6222908207972 901 | 183.71236966462178 570.5825366806959 902 | 531.7804313879102 226.46158094428947 903 | 770.8455163931065 421.45306039783736 904 | 154.34821967497703 636.9843566607452 905 | 496.41001943167885 699.2343109962165 906 | 487.5662709299454 947.8764284961142 907 | 119.78924953025594 6.471710459666324 908 | 601.9145437827291 321.43136157060883 909 | 107.12853018646572 487.7910868861562 910 | 467.7689293291617 7.79010914457301 911 | 887.4972943726741 689.6519183626291 912 | 885.7124405775867 811.8764677065253 913 | 923.2994668072181 391.24736477857346 914 | 522.4916658878194 104.73649633210114 915 | 617.4231356692951 346.2787307433747 916 | 427.16060161365135 534.3418462458463 917 | 291.53558785043833 626.3083321653553 918 | 754.4931150744792 107.51826776161322 919 | 213.09274917292353 788.6223224691371 920 | 806.5346991705529 112.5122653290217 921 | 923.0469293933457 405.01042970427824 922 | 918.2024637105897 430.8105400405696 923 | 921.9007198296946 582.5968309490894 924 | 159.1323566653815 147.17789661004798 925 | 108.66848044548105 983.83280362543 926 | 301.5106511027275 8.48185918631794 927 | 235.47139449703624 509.9881939793356 928 | 12.416927921543031 204.72246311532894 929 | 39.90616169084116 250.95559298451496 930 | 769.2435113263567 149.78867900578587 931 | 647.9909856020312 523.9071575935468 932 | 568.0467588716913 424.81318266162714 933 | 302.4069885821796 824.3214957691789 934 | 97.2234809468343 813.5997313087843 935 | 463.9173505400661 295.12340059912054 936 | 682.6957745321441 407.4484581696014 937 | 858.2598399762055 883.1568529735177 938 | 975.8258286364286 85.80617409883517 939 | 96.4734153797292 696.9375606690585 940 | 51.57192326490456 289.51988088231894 941 | 83.53298900279916 205.60832956845786 942 | 311.9357244992748 895.0743165815574 943 | 548.3304386826233 826.246773393316 944 | 348.53959683617785 171.04446057233304 945 | 677.4547950052334 135.15167735233246 946 | 708.2126196530975 252.09676988161965 947 | 15.887508687148056 408.460665622012 948 | 326.75223791253813 301.2237307031016 949 | 509.6436461892959 448.42872566456583 950 | 248.56779939420437 547.4982635147508 951 | 808.5535516213055 683.9233474490242 952 | 133.70158877976402 684.4856202765967 953 | 721.7934698619135 347.1687198683423 954 | 968.7616028463245 693.5526992121332 955 | 24.43799852442252 123.4982473108136 956 | 344.58954705633613 16.665464661397067 957 | 650.2211010628495 46.850578268264556 958 | 641.0267163121805 144.86734686754355 959 | 673.8563361887808 570.9717592320958 960 | 467.92920884648635 111.48260592665915 961 | 385.6816402055613 684.7619116973959 962 | 751.623325423207 83.19064244585728 963 | 192.0569056678849 659.9318388880458 964 | 927.2808490379543 227.4683961827141 965 | 36.8582171906594 520.1114136925958 966 | 800.2328089777922 301.4997384924408 967 | 532.5750920059726 602.7781210116847 968 | 773.029858773597 955.5023599274897 969 | 13.932300058634661 648.8506815593777 970 | 300.09602033377183 572.524080817533 971 | 282.62132078956137 699.5195234527771 972 | 628.1119651189106 577.1122916466034 973 | 898.6407197761354 705.8617409690751 974 | 107.80248906826495 536.8613482596546 975 | 491.90881891112235 164.01579865818317 976 | 621.5928200098394 53.69502231458168 977 | 717.2259441032337 277.16655045637964 978 | 961.6365962211634 395.8418279364718 979 | 156.32778611367203 115.31905003405474 980 | 314.00766348253893 56.8135341875059 981 | 682.6854815633191 994.8147659106177 982 | 357.3873911114893 944.2976299423764 983 | 547.8717633430193 831.7717559162083 984 | 868.3674404643102 699.7272841944083 985 | 722.7270155182832 537.1058998678002 986 | 140.52776776680577 728.3929107587587 987 | 832.2228668282027 615.517236652677 988 | 970.737918042984 880.3114823729456 989 | 359.83515682121504 6.802267455518596 990 | 443.66973601012137 363.67139757752466 991 | 665.401934687172 865.0790404695475 992 | 254.29748958997223 395.52185038054597 993 | 759.8565417091413 409.9889506552711 994 | 848.2016468055048 298.477524364866 995 | 710.889785591676 203.66547419673097 996 | 230.78050322691035 237.561090814294 997 | 15.508947341192346 208.23679275468032 998 | 899.0139653458176 557.907121688546 999 | 268.6260311691785 760.8554043474813 1000 | 983.2119127698178 731.9031378853368 1001 | -------------------------------------------------------------------------------- /src/main/resources/greek-earthquakes-1964-2000.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ambling/rtree-benchmark/26949403d1314e4a0f41da632460484fd82b415a/src/main/resources/greek-earthquakes-1964-2000.txt.gz --------------------------------------------------------------------------------