New functions isc_block_used and isc_block_size. Fixed 'leak'
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 13 Mar 1998 15:30:50 +0000 (15:30 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 13 Mar 1998 15:30:50 +0000 (15:30 +0000)
in isc_alloc_block.

include/isamc.h
index/invstat.c
isamc/isamc.c

index 706e479..139a1e2 100644 (file)
@@ -4,7 +4,11 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: isamc.h,v $
- * Revision 1.6  1997-09-17 12:19:10  adam
+ * Revision 1.7  1998-03-13 15:30:50  adam
+ * New functions isc_block_used and isc_block_size. Fixed 'leak'
+ * in isc_alloc_block.
+ *
+ * Revision 1.6  1997/09/17 12:19:10  adam
  * Zebra version corresponds to YAZ version 1.4.
  * Changed Zebra server so that it doesn't depend on global common_resource.
  *
@@ -79,6 +83,9 @@ int isc_read_item (ISAMC_PP pp, char **dst);
 int isc_pp_read (ISAMC_PP pp, void *buf);
 int isc_pp_num (ISAMC_PP pp);
 
+int isc_block_used (ISAMC is, int type);
+int isc_block_size (ISAMC is, int type);
+
 #define isc_type(x) ((x) & 7)
 #define isc_block(x) ((x) >> 3)
 
index fedd31d..afd0147 100644 (file)
@@ -4,7 +4,11 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: invstat.c,v $
- * Revision 1.6  1998-03-06 13:54:02  adam
+ * Revision 1.7  1998-03-13 15:30:50  adam
+ * New functions isc_block_used and isc_block_size. Fixed 'leak'
+ * in isc_alloc_block.
+ *
+ * Revision 1.6  1998/03/06 13:54:02  adam
  * Fixed two nasty bugs in isc_merge.
  *
  * Revision 1.5  1997/09/17 12:19:13  adam
@@ -38,6 +42,7 @@
 struct inv_stat_info {
     ISAM isam;
     ISAMC isamc;
+    int no_isam_entries[8];
     int no_dict_entries;
     int no_dict_bytes;
     int isam_bounds[20];
@@ -48,7 +53,7 @@ struct inv_stat_info {
 static int inv_stat_handle (char *name, const char *info, int pos,
                             void *client)
 {
-    int occur;
+    int occur = 0;
     int i = 0;
     struct inv_stat_info *stat_info = (struct inv_stat_info*) client;
     ISAM_P isam_p;
@@ -75,18 +80,16 @@ static int inv_stat_handle (char *name, const char *info, int pos,
 
         pp = isc_pp_open (stat_info->isamc, isam_p);
         occur = isc_pp_num (pp);
-#if 1
         while (isc_pp_read(pp, buf))
             occurx++;
         assert (occurx == occur);
-#endif
+       stat_info->no_isam_entries[isc_type(isam_p)] += occur;
         isc_pp_close (pp);
     }
 
     while (occur > stat_info->isam_bounds[i] && stat_info->isam_bounds[i])
         i++;
     ++(stat_info->isam_occurrences[i]);
-
     return 0;
 }
 
@@ -132,6 +135,8 @@ void inv_prstat (BFiles bfs)
     }
     records = rec_open (bfs, 0);
 
+    for (i = 0; i<8; i++)
+       stat_info.no_isam_entries[i] = 0;
     stat_info.no_dict_entries = 0;
     stat_info.no_dict_bytes = 0;
     stat_info.isam = isam;
@@ -139,7 +144,7 @@ void inv_prstat (BFiles bfs)
     stat_info.isam_bounds[0] = 1;
     stat_info.isam_bounds[1] = 2;
     stat_info.isam_bounds[2] = 3;
-    stat_info.isam_bounds[3] = 5;
+    stat_info.isam_bounds[3] = 6;
     stat_info.isam_bounds[4] = 10;
     stat_info.isam_bounds[5] = 20;
     stat_info.isam_bounds[6] = 30;
@@ -161,16 +166,28 @@ void inv_prstat (BFiles bfs)
 
     dict_scan (dict, term_dict, &before, &after, &stat_info, inv_stat_handle);
 
-    rec_close (&records);
-    dict_close (dict);
-    if (isam)
-        is_close (isam);
     if (isamc)
-        isc_close (isamc);
-
-    fprintf (stderr, "%d dictionary entries. %d bytes for strings\n",
+    {
+       fprintf (stderr, "   Blocks    Occur  Size KB   Bytes/Entry\n");
+       for (i = 0; isc_block_used (isamc, i) >= 0; i++)
+       {
+           fprintf (stderr, " %8d %8d", isc_block_used (isamc, i),
+                    stat_info.no_isam_entries[i]);
+
+           if (stat_info.no_isam_entries[i])
+               fprintf (stderr, " %8d   %f",
+                        (int) ((1023.0 + (double) isc_block_used(isamc, i) *
+                                isc_block_size(isamc,i))/1024),
+                        ((double) isc_block_used(isamc, i) *
+                         isc_block_size(isamc,i))/
+                        stat_info.no_isam_entries[i]);
+           fprintf (stderr, "\n");
+       }
+    }
+       
+    fprintf (stderr, "\n%d words using %d bytes\n",
              stat_info.no_dict_entries, stat_info.no_dict_bytes);
-    fprintf (stderr, " size   occurrences\n");
+    fprintf (stderr, "    Occurrences     Words\n");
     prev = 1;
     for (i = 0; stat_info.isam_bounds[i]; i++)
     {
@@ -181,4 +198,13 @@ void inv_prstat (BFiles bfs)
     }
     fprintf (stderr, "%7d-        %7d\n",
              prev, stat_info.isam_occurrences[i]);
+
+    rec_close (&records);
+    dict_close (dict);
+
+    if (isam)
+        is_close (isam);
+    if (isamc)
+        isc_close (isamc);
+    
 }
index 9cd4471..44155d2 100644 (file)
@@ -4,7 +4,11 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: isamc.c,v $
- * Revision 1.10  1998-03-11 11:18:18  adam
+ * Revision 1.11  1998-03-13 15:30:50  adam
+ * New functions isc_block_used and isc_block_size. Fixed 'leak'
+ * in isc_alloc_block.
+ *
+ * Revision 1.10  1998/03/11 11:18:18  adam
  * Changed the isc_merge to take into account the mfill (minimum-fill).
  *
  * Revision 1.9  1998/03/06 13:54:02  adam
@@ -68,9 +72,9 @@ ISAMC_M isc_getmethod (void)
         {   32,    28,     0,    3 },
        {   64,    54,    30,    0 },
 #else
-        {   32,    28,    20,    20 },
-        {  512,   490,   340,    20 },
-        { 4096,  3950,  3200,    20 },
+        {   32,    28,    24,    20 },
+        {  512,   490,   350,    20 },
+        { 4096,  3950,  4200,    20 },
         {32768, 32000, 30000,     0 },
 #endif
     };
@@ -161,6 +165,21 @@ ISAMC isc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M method)
     return is;
 }
 
+int isc_block_used (ISAMC is, int type)
+{
+    if (type < 0 || type >= is->no_files)
+       return -1;
+    return is->files[type].head.lastblock-1;
+}
+
+int isc_block_size (ISAMC is, int type)
+{
+    ISAMC_filecat filecat = is->method->filecat;
+    if (type < 0 || type >= is->no_files)
+       return -1;
+    return filecat[type].bsize;
+}
+
 int isc_close (ISAMC is)
 {
     int i;
@@ -246,6 +265,7 @@ int isc_alloc_block (ISAMC is, int cat)
             if ((nb = is->files[cat].fc_list[j]) && (!block || nb < block))
             {
                 is->files[cat].fc_list[j] = 0;
+               block = nb;
                 break;
             }
     }