- 25 Mar, 2018 1 commit
-
-
Jim Fulton authored
-
- 10 Mar, 2018 1 commit
-
-
Marius Gedminas authored
Fix typo in doctest documentation of find_global method
-
- 09 Mar, 2018 1 commit
-
-
Harun Yasar authored
-
- 15 Feb, 2018 1 commit
-
-
Jim Fulton authored
* Don't seek on imports (other than the possible seek for custom importers) We were seeking to handle blob markers. This has two major drawbacks: 1. It wasn't possible to use a non-seekable file. A use case for export/import is to copy database data. An intermediate file, and associated I/O, could be avoided using a pipe, but pipes aren't seekable. 2. Seeks cause file-buffer data to be discarded, making IO far more expensive. We didn't really need blob markers, because the preceeding blob data records serve as markers. (Now we're stuck with them for backward compatibility.) * Make cp's buffer size larger and configurable. * Use the storage temprary directory when importing blobs To avoid an extra copy. Also, allow the copy (cp) buffer sie to be overridden on export. (I see no obvious way to plumb it on import. :( ) * Oops, need to use a binary literal (Python 3) * Respond to PR comments
-
- 14 Nov, 2017 1 commit
-
-
Jim Fulton authored
Especially with regard to write capacity and search. This hasn't been updated in a while and I feel that it is out of date. I feel that this could use more work, but I'm anxious to do an incremental improvement given the screencast I just released. :)
-
- 13 Nov, 2017 2 commits
-
-
Julien Muchembled authored
Report full oid of missing object during pack
-
Julien Muchembled authored
Review Connection/DB closure
-
- 12 Nov, 2017 1 commit
-
-
Jim Fulton authored
-
- 08 Nov, 2017 1 commit
-
-
Julien Muchembled authored
In addition to some micro-optimisation, this fixes the following minor issues: - Closing a DB left Connections registered to the global transaction manager. Which broke at least multi-db because only such primary connections were ignored with monkey-patches. - Stop calling the real newTransaction when aborting an existing transaction. This was not the case if explicit_transactions=0.
-
- 07 Nov, 2017 1 commit
-
-
David Glick authored
-
- 30 Oct, 2017 1 commit
-
-
Joni Orponen authored
Unpin specific PyPy versions, blacklist 3.3 in `setup.py`
-
- 27 Oct, 2017 2 commits
-
-
Joni Orponen authored
-
Joni Orponen authored
-
- 05 Oct, 2017 1 commit
-
-
Marius Gedminas authored
-
- 30 Aug, 2017 2 commits
-
-
Jim Fulton authored
-
Jim Fulton authored
-
- 29 Aug, 2017 2 commits
-
-
Jason Madden authored
* Use a higher pickle protocol (2) for serializing objects on Python 2 Previously protocol 1 was used. This is more efficient for new-style classes (all persistent objects are new-style), according to the docs, at the cost of being very slightly less space efficient for old-style classes. In tests of a persistent object with two trivial numeric attributes, the higher protocol was 12 bytes smaller, and serialized and deserialized 1us faster. Introducing a reference to another new-style class for a more realistic test made the higher protocol twice as fast to serialize (20.5 vs 10.3us), almost half the size (215 vs 142 bytes), and it deserialized 30% faster (6.5 vs 4.6us). On Python 2, this will now allow open ``file`` objects to be pickled (loading the object will result in a closed file); previously this would result in a ``TypeError`` (as does under Python 3). We had tests that you couldn't do that with a BlobFile so I had to update it to still make that true. I wouldn't recommend serializing arbitrary open files under Python 2 (for one thing, they can't trivially be deserialized in Python 3), but I didn't take any steps to prevent it either. Since this hasn't been possible, there shouldn't be code in the wild that is trying to do it---and it wouldn't be forward compatible with Python 3 either.
-
XeL64 authored
-
- 25 Jul, 2017 4 commits
-
-
Tres Seaver authored
[ci skip]
-
Tres Seaver authored
-
Tres Seaver authored
Add badges to README.
-
Tres Seaver authored
[ci skip]
-
- 24 Jul, 2017 11 commits
-
-
Jason Madden authored
HistoricalStorageAdapter forwards release() to its instance
-
Jason Madden authored
[skip ci]
-
Jason Madden authored
Fixes #78. Also adjust the base wrapper's __getattr__ to be faster (500 vs 711ns in a benchmark of the common case) and behave the same on Python 2 vs Python 3 with regards to exceptions, should a method be implemented as an descriptor. In practice this probably makes no difference whatsoever, it's just the same pattern used for forwarding release.
-
Jason Madden authored
Add support for 3.6, drop 3.3
-
Jason Madden authored
[skip appveyor]
-
Jason Madden authored
Remove outdated comment. Remove redundant usedevelop. [skip ci]
-
Jason Madden authored
We need a newer setuptools on older versions of Python to be able to install recent Sphinx because of its use of environment markers.
-
Jason Madden authored
-
Jason Madden authored
-
Jason Madden authored
-
Jason Madden authored
Also add note on supported versions to the docs and readme. Fixes #168. Update tox.ini to correctly run testdocumentation and DRY with test deps.
-
- 17 May, 2017 5 commits
-
-
Jim Fulton authored
-
Jim Fulton authored
-
Jim Fulton authored
-
Jim Fulton authored
-
Adam Groszer authored
* clean up references to DBs and Connections in pools * Implement an explicit clear() method for clearing all the items in the pool.
-
- 17 Apr, 2017 1 commit
-
-
Jason Madden authored
* Make all classes new-style. On PyPy, it's documented (http://pypy.org/performance.html#id3) that old-style classes are slow, and classes that derive from both old and new are especially slow. I checked with the PyPy devs on IRC today and they confirmed that's still true with the latest PyPy2 releases. Unfortunately, FileStorage was one such mixed class, as was Connection. Moving to new-style classes seems to have a positive impact in the benchmarks. Here's zodbshootout on PyPy2 5.7.1 against a FileStorage (running in --threads and with 5 reps to be sure we get warmed up). First, current ZODB: "Transaction", fs "Add 1000 Objects", 31,738 "Update 1000 Objects", 42,444 "Read 1000 Cold Objects", 51,894 "Read 1000 Hot Objects", 53,187 "Read 1000 Steamin' Objects", 835,877 And with this PR: "Transaction", fs "Add 1000 Objects", 35,651 "Update 1000 Objects", 54,906 "Read 1000 Cold Objects", 103,484 "Read 1000 Hot Objects", 84,721 "Read 1000 Steamin' Objects", 2,112,095 The tests that hit the storage extensively are notably faster, as are steamin and hot, Connection having been a mixed class. I ran all tests multiple times. The data files were removed between runs. There's some variation, but the new-style classes always seem better. For comparison, here's CPython 2.7.13: "Transaction", fs "Add 1000 Objects", 19,531 "Update 1000 Objects", 16,201 "Read 1000 Cold Objects", 22,111 "Read 1000 Hot Objects", 21,851 "Read 1000 Steamin' Objects", 880,582 Locally I've run the tests under 2.7 and they all passed.
-
- 14 Apr, 2017 1 commit
-
-
Jason Madden authored
Profiling (https://github.com/zodb/zodbshootout/pull/32/) showed that this method was the only blob-related method that showed up in a test of creating blobs, other than those that actually performed IO. With this change its total and cumulative time drops from 0.003/0.004 to 0.001/0.002 in a small benchmark. Blobs created per second shows a small but consistent improvement. Before: ncalls tottime percall cumtime percall filename:lineno(function) 100 0.005 0.000 0.005 0.000 {built-in method rename} 100 0.004 0.000 0.004 0.000 {function BlobFile.close at 0x1080d3a60} 200 0.003 0.000 0.004 0.000 blob.py:576(oid_to_path) 101 0.003 0.000 0.003 0.000 {built-in method mkdir} 100 0.002 0.000 0.002 0.000 blob.py:333(__init__) 402 0.002 0.000 0.005 0.000 {method 'dump' of '_pickle.Pickler' objects} 1 0.002 0.002 0.034 0.034 Connection.py:553(_store_objects) 201 0.002 0.000 0.002 0.000 {built-in method stat} 5633 0.001 0.000 0.002 0.000 {built-in method isinstance} After: ncalls tottime percall cumtime percall filename:lineno(function) 100 0.005 0.000 0.005 0.000 {built-in method rename} 101 0.005 0.000 0.005 0.000 {built-in method mkdir} 100 0.004 0.000 0.004 0.000 {function BlobFile.close at 0x10636aa60} 402 0.002 0.000 0.005 0.000 {method 'dump' of '_pickle.Pickler' objects} 100 0.002 0.000 0.002 0.000 blob.py:333(__init__) 1 0.002 0.002 0.035 0.035 Connection.py:553(_store_objects) 201 0.002 0.000 0.002 0.000 {built-in method stat} 4033 0.001 0.000 0.001 0.000 {built-in method isinstance} .... 200 0.001 0.000 0.002 0.000 blob.py:576(oid_to_path)
-