[Openmcl-devel] eql and equal hash tables help please

George Khouri gk1 at four-four.com
Wed Jan 16 15:31:57 PST 2013


Friends,
In a program that traverses a file system of ~125000 entries and adds 
the pathnames as keys to an #'equalhash table,ccl hangs in 
CCL::LOCK-FREE-PUTHASH with no progress after ~14000 entries - seems 
like it's just thrashing. No error is thrown and I can interrupt it with 
control-C.
If I add the pathnames to an #'eql hash table ccl has no problem with 
the same directory.
Is this expected behavior?

Itried the same thing in SBCL which works with either an eql or an equal 
hash table. BTW, the eql version runs in ~6 seconds in SBCL, compared to 
~70 seconds in CCL, though I realize this speed difference could be a 
memory issue and not one of algorithms. Iknow nothing about SBCL.

I'm running ccl 1.8 on linux 3.2.0-33-generic Ubuntu 12.04 on a core i5 
thinkpad, 4GB.

It doesn't "appear" that I'm  running low on memory, but the program 
behaves that way with the equal hash table, and though I've tried the 
various ccl command-line options to increase stack and heap allocations, 
as well as ulimit stack size, I've had no change in results. I've tried 
various values for initial hash table size, rehash size and threshold 
but nothing seems to have any beneficial effect.  The system monitor 
doesn't show any disk swapping going on.
Is there some memory parameter I'm missing that I need to change? Is 
there  a problem related to having 4 cpu cores?

Here's the typical output when I interrupt the seemingly hung program - 
the hashtable won't grow beyond this point:

Welcome to Clozure Common Lisp Version 1.8-r15286M  (LinuxX8664)!
? (traverse-filesystem "/home/gkhouri/")
................^C
 > Break: interrupt signal
 > While executing: CCL::LOCK-FREE-PUTHASH, in process listener(1).
...
1 > (:f 0)
  (7FB9FE90FF80) : 0 (LOCK-FREE-PUTHASH 
#P"/tmp/gkhouri-test/Documents/Music/M Stal Tunes.csv" #<HASH-TABLE 
:TEST EQUAL size 13672/13673 #x302000753F9D> T) 613
   (CCL::KEY CCL::HASH CCL::VALUE)
    CCL::KEY: #P"/tmp/gkhouri-test/Documents/Music/M Stal Tunes.csv"
    CCL::HASH: #<HASH-TABLE :TEST EQUAL size 13672/13673 #x302000753F9D>
    CCL::VALUE: T

1 > (room)
Approximately 17,432,576 bytes of memory can be allocated
before the next full GC is triggered.

                    Total Size             Free Used
Lisp Heap:       41025536 (40064K)   17432576 (17024K)   23592960 (23040K)
Stacks:          11072816 (10813K)   11055872 (10797K)      16944 (17K)
Static:          20304144 (19828K)          0 (0K)       20304144 (19828K)
376792.870 MB reserved for heap expansion.


If I create the equal hash table with :lock-free set to nil, 
(make-hash-table :test #'equal :lock-free nil),  ccl presumably uses an 
older hashing algorithm and I don't think I have the problem storing the 
pathnames, BUT after about 15,000 entries, things slow down drastically, 
and unacceptably, presumably from rehashing(?), and I killed the program 
after about 60,000 entries because it was taking so long. With 
:lock-free enabled, I never get past ~14K entries.

Thanks for any info.
George Khouri




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20130116/e019f049/attachment.htm>


More information about the Openmcl-devel mailing list