Hello Thomas,
I could send you my quick and dirty version of the BitField class. In
our initial tests with large databases (300+ MB) the BitField
operations were taking 70% of the Database.open time.
The actual file IO was not even on the picture. When we used the
modified BitField ( and a couple of small changes to the DiskFile
class) the file IO came up and became the slowest operation.
Alex
On Oct 13, 3:19 pm, "Thomas Mueller" <[EMAIL PROTECTED]>
wrote:
> Hi,
>
> Thank for your help! I will have a look how this can be improved.
> Maybe it makes sense to use int or byte, but I want to make sure it
> does in fact get faster so I will need to write some benchmarks as
> well.
>
> Regards,
> Thomas
>
> On Sat, Oct 11, 2008 at 12:00 AM, Alex <[EMAIL PROTECTED]> wrote:
>
> > We were looking at some profiles running on large databases and
> > noticed that under some circumstances BitField operations are taking a
> > large percentage of time when opening the database.
>
> > Particularly the BitField class is implemented using "long" data type
> > for bit storage. However when it gets used from the DiskFile class
> > getSummary() and initFromSummary() methods they are using bytes. The
> > code there basically moves the data from the longs into the bytes bit
> > by bit which is very inefficient. It would be very easy to modify the
> > BitField class to utilize the byte[] for storage and use this byte[]
> > directly to store/restore the allocation table.
>
> > We also noticed that sometimes the BitField.setRange method is also
> > taking considerable time.
> > I guess there should be a way to optimize it as well using byte/long
> > operations rather than iterating the range bit by bit.
>
> > Below are the code snippets in question:
>
> > initFromSummary:
> > ======================================================
> > for (int i = 0, x = 0; i < b2 / 8; i++) {
> > int mask = in.read();
> > if (init) {
> > for (int j = 0; j < 8; j++, x++) {
> > if (used.get(x) != ((mask & (1 << j)) !=
> > 0)) {
> > throw Message.getInternalError("Redo
> > failure, block: " + x + " expected in-use bit: " + used.get(x));
> > }
> > }
> > } else {
> > for (int j = 0; j < 8; j++, x++) {
> > if ((mask & (1 << j)) != 0) {
> > used.set(x);
> > }
> > }
> > }
> > }
> > ======================================================
>
> > getSummary()
>
> > ======================================================
> > for (int i = 0, x = 0; i < blocks / 8; i++) {
> > int mask = 0;
> > for (int j = 0; j < 8; j++) {
> > if (used.get(x)) {
> > mask |= 1 << j;
> > }
> > x++;
> > }
> > out.write(mask);
> > }
> > ====================================================
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/h2-database?hl=en
-~----------~----~----~----~------~----~------~--~---