Commits

Anonymous committed 54d7670

Consolidated benchmark code in whoosh.support.bench. Added ability to benchmark Xapian, Xappy, and Solr.

Comments (0)

Files changed (7)

 
 bmark
 *testindex
-benchmark/enron_index
-benchmark/reuters_index
+benchmark/enron_index*
+benchmark/reuters_index*
+benchmark/dictionary_index*
 benchmark/enron_cache.pickle
 benchmark/enron_mail_082109.tar.gz

benchmark/dictionary.py

-import gzip, os.path, re
-from optparse import OptionParser
+import os.path, gzip
 
-from whoosh import analysis, fields, index, qparser, query
-from whoosh.util import now
+from whoosh import analysis, fields
+from whoosh.support.bench import Bench
 
-ana = analysis.StemmingAnalyzer()
-#ana = analysis.StandardAnalyzer()
-schema = fields.Schema(head=fields.ID(stored=True),
-                       body=fields.TEXT(analyzer=ana, stored=True))
 
+class VulgarTongue(Bench):
+    _name = "dictionary"
+    filename = "dcvgr10.txt.gz"
+    headline_field = "head"
+    
+    def documents(self):
+        path = os.path.join(self.options.dir, self.filename)
+        f = gzip.GzipFile(path)
+        
+        head = body = None
+        for line in f:
+            line = line.decode("latin1")
+            if line[0].isalpha():
+                if head:
+                    yield {"head": head, "body": head + body}
+                head, body = line.split(".", 1)
+            else:
+                body += line
+                
+        if head:
+            yield {"head": head, "body": head + body}
+    
+    def whoosh_schema(self):
+        ana = analysis.StemmingAnalyzer()
+        #ana = analysis.StandardAnalyzer()
+        schema = fields.Schema(head=fields.ID(stored=True),
+                               body=fields.TEXT(analyzer=ana, stored=True))
+        return schema
 
-def read_entries(file):
-    head = body = None
-    for line in file:
-        line = line.decode("latin1")
-        if line[0].isalpha():
-            if head:
-                yield {"head": head, "body": head + body, "_stored_body": body}
-            head, body = line.split(".", 1)
-        else:
-            body += line
-            
-    if head:
-        yield {"head": head, "body": head + body, "_stored_body": body}
+
+if __name__ == "__main__":
+    VulgarTongue().run()
+
     
-
-def do_index(file, indexname, **kwargs):
-    print "Indexing..."
-    if not os.path.exists(indexname):
-        os.mkdir(indexname)
-    ix = index.create_in(indexname, schema)
-    
-    t = now()
-    w = ix.writer(**kwargs)
-    
-    if file.endswith(".gz"):
-        f = gzip.GzipFile(file, "rb")
-    else:
-        f = open(file, "rb")
-    
-    for entry in read_entries(f):
-        w.add_document(**entry)
-    print "Spool:", now() - t
-    ct = now()
-    w.commit()
-    print "Commit:", now() - ct
-    print "Total:", now() - t
-
-
-def do_search(indexname, q, limit=10, showbody=False):
-    ix = index.open_dir(indexname)
-    s = ix.searcher()
-    q = qparser.QueryParser("body", schema=s.schema).parse(q)
-    print "query=", q
-    r = s.search(q, limit=limit)
-    print "result=", r
-    for hit in r:
-        print hit.pos, hit["head"]
-        if showbody:
-            print hit["body"]
-        
-if __name__ == "__main__":
-    parser = OptionParser()
-    parser.add_option("-i", "--index", dest="index",
-                      help="Index the documents", default=False,
-                      action="store_true")
-    parser.add_option("-s", "--source", dest="source", metavar="FILENAME",
-                      help="File containing the corpus date.",
-                      default="dcvgr10.txt.gz")
-    parser.add_option("-d", "--dir", dest="dir", metavar="DIRNAME",
-                      help="Directory in which to store files, index, etc.",
-                      default=".")
-    parser.add_option("-n", "--name", dest="indexname",
-                      help="Name of the index directory",
-                      default="dictionary_index")
-    parser.add_option("-m", "--mb", dest="limitmb",
-                      help="Memory size, in MB",
-                      default="128")
-    parser.add_option("-p", "--procs", dest="procs",
-                      help="Use this many processors to index.",
-                      default="1")
-    parser.add_option("-l", "--limit", dest="limit",
-                      help="Maximum number of results to display for a search.",
-                      default="10")
-    parser.add_option("-b", "--body", dest="showbody",
-                      help="Show the body of entries found by a search.",
-                      default=False, action="store_true")
-    parser.add_option("-t", "--tempdir", dest="tempdir",
-                      help="Directory to use for temp file storage",
-                      default=None)
-    
-    options, args = parser.parse_args()
-    
-    if options.index:
-        do_index(options.source, options.indexname, procs=int(options.procs),
-                 limitmb=int(options.limitmb), dir=options.tempdir)
-        
-    if args:
-        qs = " ".join(args).decode("utf8")
-        print "Query string=", repr(qs)
-        do_search(options.indexname, qs, limit=int(options.limit),
-                  showbody=options.showbody)
-    
-    

benchmark/enron.py

 from __future__ import division
+import os.path, tarfile
+from email import message_from_string
+from marshal import dump, load
+from urllib import urlretrieve
 from zlib import compress, decompress
-from email import message_from_string
-import os.path, tarfile
-from marshal import dump, load
-from optparse import OptionParser
-from urllib import urlretrieve
 
-from whoosh import analysis, fields, index, qparser
+try:
+    import xappy
+except ImportError:
+    pass
+
+from whoosh import analysis, fields
+from whoosh.support.bench import Bench
 from whoosh.util import now
 
 
-# http://www.cs.cmu.edu/~enron/
-enron_archive_url = "http://www.cs.cmu.edu/~enron/enron_mail_082109.tar.gz"
-enron_archive_filename = "enron_mail_082109.tar.gz"
-cache_filename = "enron_cache.pickle"
+# Benchmark class
 
-ana = analysis.StemmingAnalyzer(maxsize=40)
-schema = fields.Schema(body=fields.TEXT(analyzer=ana, stored=True),
-                       date=fields.ID(stored=True),
-                       frm=fields.ID(stored=True),
-                       to=fields.IDLIST(stored=True),
-                       subject=fields.TEXT(stored=True),
-                       cc=fields.IDLIST,
-                       bcc=fields.IDLIST)
+class EnronBench(Bench):
+    enron_archive_url = "http://www.cs.cmu.edu/~enron/enron_mail_082109.tar.gz"
+    enron_archive_filename = "enron_mail_082109.tar.gz"
+    cache_filename = "enron_cache.pickle"
 
-header_to_field = {"Date": "date", "From": "frm", "To": "to",
+    header_to_field = {"Date": "date", "From": "frm", "To": "to",
                    "Subject": "subject", "Cc": "cc", "Bcc": "bcc"}
 
+    _name = "enron"
+    main_field = "body"
+    headline_field = "subject"
+    
+    field_order = ("subject", "date", "from", "to", "cc", "bcc", "body")
 
-# Functions for downloading and then reading the email archive and caching
-# the messages in an easier-to-digest format
+    # Functions for downloading and then reading the email archive and caching
+    # the messages in an easier-to-digest format
+    
+    def download_archive(self, archive):
+        print "Downloading Enron email archive to %r..." % archive
+        t = now()
+        urlretrieve(self.enron_archive_url, archive)
+        print "Downloaded in ", now() - t, "seconds"
+        
+    def get_texts(self, archive):
+        archive = tarfile.open(archive, "r:gz")
+        while True:
+            entry = archive.next()
+            archive.members = []
+            if entry is None:
+                break
+            f = archive.extractfile(entry)
+            if f is not None:
+                text = f.read()
+                yield text
+    
+    def get_messages(self, archive, headers=True):
+        header_to_field = self.header_to_field
+        for text in self.get_texts(archive):
+            message = message_from_string(text)
+            body = message.as_string().decode("latin_1")
+            blank = body.find("\n\n")
+            if blank > -1:
+                body = body[blank+2:]
+            d = {"body": body}
+            if headers:
+                for k in message.keys():
+                    fn = header_to_field.get(k)
+                    if not fn: continue
+                    v = message.get(k).strip()
+                    if v:
+                        d[fn] = v.decode("latin_1")
+            yield d
+    
+    def cache_messages(self, archive, cache):
+        print "Caching messages in %s..." % cache
+        
+        if not os.path.exists(archive):
+            raise Exception("Archive file %r does not exist" % archive)
+        
+        t = now()
+        f = open(cache, "wb")
+        c = 0
+        for d in self.get_messages(archive):
+            c += 1
+            dump(d, f)
+            if not c % 1000: print c
+        f.close()
+        print "Cached messages in ", now() - t, "seconds"
 
-def download_archive(archive):
-    print "Downloading Enron email archive to %r..." % archive
-    t = now()
-    urlretrieve(enron_archive_url, archive)
-    print "Downloaded in ", now() - t, "seconds"
+    def setup(self, options, args):
+        archive = os.path.abspath(os.path.join(options.dir, self.enron_archive_filename))
+        cache = os.path.abspath(os.path.join(options.dir, self.cache_filename))
     
-def get_texts(archive):
-    archive = tarfile.open(archive, "r:gz")
-    while True:
-        entry = archive.next()
-        archive.members = []
-        if entry is None:
-            break
-        f = archive.extractfile(entry)
-        if f is not None:
-            text = f.read()
-            yield text
-
-def get_messages(archive, headers=True):
-    for text in get_texts(archive):
-        message = message_from_string(text)
-        body = message.as_string().decode("latin_1")
-        blank = body.find("\n\n")
-        if blank > -1:
-            body = body[blank+2:]
-        d = {"body": body}
-        if headers:
-            for k in message.keys():
-                fn = header_to_field.get(k)
-                if not fn: continue
-                v = message.get(k).strip()
-                if v:
-                    d[fn] = v.decode("latin_1")
-        yield d
-        
-def cache_messages(archive, cache):
-    print "Caching messages in %s..." % cache
-    
-    if not os.path.exists(archive):
-        raise Exception("Archive file %r does not exist" % archive)
-    
-    t = now()
-    f = open(cache, "wb")
-    c = 0
-    for d in get_messages(archive):
-        c += 1
-        dump(d, f)
-        if not c % 1000: print c
-    f.close()
-    print "Cached messages in ", now() - t, "seconds"
-
-
-# Functions for reading the cached messages
-
-def get_cached_messages(cache):
-    f = open(cache, "rb")
-    try:
-        while True:
-            d = load(f)
-            yield d
-    except EOFError:
-        pass
-    f.close()
-
-
-# Main function for indexing the cached messages
-
-def do_index(cache, indexname, chunk=1000, skip=1, upto=600000, **kwargs):
-    print "Indexing..."
-    if not os.path.exists(indexname):
-        os.mkdir(indexname)
-    ix = index.create_in(indexname, schema)
-    
-    w = ix.writer(**kwargs)
-    starttime = chunkstarttime = now()
-    c = 0
-    skipc = skip
-    for d in get_cached_messages(cache):
-        skipc -= 1
-        if not skipc:
-            d["_stored_body"] = compress(d["body"], 9)
-            w.add_document(**d)
-            skipc = skip
-            c += 1
-            if c > upto:
-                break
-            if not c % chunk:
-                t = now()
-                sofar = t - starttime
-                print "Indexed %d messages, %f for %d, %f total, %f docs/s" % (c, t - chunkstarttime, chunk, sofar, c/sofar)
-                schema.clean()
-                chunkstarttime = t
-    spooltime = now()
-    print "Spool", spooltime - starttime
-    w.commit()
-    committime = now()
-    print "Commit", (committime - spooltime)
-    print "Total", (committime - starttime), "for", c
-
-
-# Main function for testing the archive
-
-def do_search(indexname, q, limit=10, showbody=False):
-    ix = index.open_dir(indexname)
-    s = ix.searcher()
-    q = qparser.QueryParser("body", schema=s.schema).parse(q)
-    print "query=", q
-    r = s.search(q, limit=limit)
-    print "result=", r
-    t = now()
-    for hit in r:
-        print hit.pos, hit.get("subject")
-        if showbody:
-            print decompress(hit["body"])
-    print "Print time:", now() - t
-
-
-if __name__=="__main__":
-    parser = OptionParser()
-    parser.add_option("-d", "--dir", dest="dir", metavar="DIRNAME",
-                      help="directory in which to store files, index, etc.",
-                      default=".")
-    parser.add_option("-s", "--setup", dest="setup", action="store_true",
-                      help="Download and cache the document archive if necessary.",
-                      default=False)
-    parser.add_option("-i", "--index", dest="index", action="store_true",
-                      help="Index the documents.",
-                      default=False)
-    parser.add_option("-n", "--name", dest="indexname",
-                      help="Name of the index directory",
-                      default="enron_index")
-    parser.add_option("-m", "--mb", dest="limitmb",
-                      help="Memory size, in MB",
-                      default="128")
-    parser.add_option("-c", "--chunk", dest="chunk",
-                      help="Report indexing progress in chunks of this many documents.",
-                      default="1000")
-    parser.add_option("-k", "--skip", dest="skip",
-                      help="Skip this many documents before indexing a document.",
-                      default="1")
-    parser.add_option("-u", "--upto", dest="upto",
-                      help="Only index up to this document.",
-                      default="600000")
-    parser.add_option("-p", "--procs", dest="procs",
-                      help="Use this many processors to index.",
-                      default="1")
-    parser.add_option("-l", "--limit", dest="limit",
-                      help="Maximum number of results to display for a search.",
-                      default="10")
-    parser.add_option("-b", "--body", dest="showbody",
-                      help="Show the body of emails found by a search.",
-                      default=False, action="store_true")
-    parser.add_option("-t", "--tempdir", dest="tempdir",
-                      help="Directory to use for temp file storage",
-                      default=None)
-    options, args = parser.parse_args()
-    
-    archive = os.path.abspath(os.path.join(options.dir, enron_archive_filename))
-    cache = os.path.abspath(os.path.join(options.dir, cache_filename))
-    
-    if options.setup:
         if not os.path.exists(archive):
-            download_archive(archive)
+            self.download_archive(archive)
         else:
             print "Archive is OK"
         
         if not os.path.exists(cache):
-            cache_messages(archive, cache)
+            self.cache_messages(archive, cache)
         else:
             print "Cache is OK"
     
-    procs = int(options.procs)
-    if options.index:
-        do_index(cache, options.indexname, chunk=int(options.chunk),
-                 skip=int(options.skip), upto=int(options.upto),
-                 procs=int(options.procs), limitmb=int(options.limitmb),
-                 dir=options.tempdir)
+    def documents(self):
+        if not os.path.exists(self.cache_filename):
+            raise Exception("Message cache does not exist, use --setup")
+        
+        f = open(self.cache_filename, "rb")
+        try:
+            while True:
+                d = load(f)
+                yield d
+        except EOFError:
+            pass
+        f.close()
     
-    if args:
-        qs = " ".join(args).decode("utf8")
-        print "Query string=", repr(qs)
-        do_search(options.indexname, qs, limit=int(options.limit),
-                  showbody=options.showbody)
+    def whoosh_schema(self):
+        ana = analysis.StemmingAnalyzer(maxsize=40)
+        schema = fields.Schema(body=fields.TEXT(analyzer=ana, stored=True),
+                               date=fields.ID(stored=True),
+                               frm=fields.ID(stored=True),
+                               to=fields.IDLIST(stored=True),
+                               subject=fields.TEXT(stored=True),
+                               cc=fields.IDLIST,
+                               bcc=fields.IDLIST)
+        return schema
+
+    def xappy_indexer_connection(self, path):
+        conn = xappy.IndexerConnection(path)
+        conn.add_field_action('body', xappy.FieldActions.INDEX_FREETEXT, language='en')
+        conn.add_field_action('body', xappy.FieldActions.STORE_CONTENT)
+        conn.add_field_action('date', xappy.FieldActions.INDEX_EXACT)
+        conn.add_field_action('date', xappy.FieldActions.STORE_CONTENT)
+        conn.add_field_action('frm', xappy.FieldActions.INDEX_EXACT)
+        conn.add_field_action('frm', xappy.FieldActions.STORE_CONTENT)
+        conn.add_field_action('to', xappy.FieldActions.INDEX_EXACT)
+        conn.add_field_action('to', xappy.FieldActions.STORE_CONTENT)
+        conn.add_field_action('subject', xappy.FieldActions.INDEX_FREETEXT, language='en')
+        conn.add_field_action('subject', xappy.FieldActions.STORE_CONTENT)
+        conn.add_field_action('cc', xappy.FieldActions.INDEX_EXACT)
+        conn.add_field_action('bcc', xappy.FieldActions.INDEX_EXACT)
+        return conn
     
+    def process_document_whoosh(self, d):
+        d["_stored_body"] = compress(d["body"], 9)
+        
+    def process_document_xapian(self, d):
+        d[self.main_field] = " ".join([d.get(name, "") for name
+                                       in self.field_order])
+    
+
+
+if __name__=="__main__":
+    EnronBench().run()
+        
+    

benchmark/enron_terms.txt

+20steve
+platkowski
+tajudeen
+22sen
+114786
+2elaw
+detailwrap
+615k
+000000000077129
+09rleibow
+35782
+sanyukt
+frayre
+rampart
+mypilotstore
+ehbn0chddh0dba0bifn0aw
+longbottom
+09richardson
+4029
+k5166
+graycliff
+accus
+boysa
+talcahuano
+dnktdlpbhorkvhoonn
+circumstanc
+x39843
+96063862
+3csmcfadden
+7035412661
+x39844
+mimetrack
+537096
+hkd2061
+01c04c04
+aux
+0056284
+christinehauk
+slhuss
+quantlab
+0glo00c08alq2t
+casamento
+reforma
+enronna
+55bhze
+pbragan
+bourreaux
+204x4
+eligib
+a15805a49335a84715283a5
+washboard
+connecti
+576220
+27d5756c
+rist
+vwipjkijmlii
+wjr
+folgar
+sperich
+flagst
+6793
+vanhorn
+cashout
+eol62993
+cmd
+velaw
+gdavis2
+tristani
+handspun
+25663
+20theroux
+markov
+kupchurch
+chinacast
+jacoksen
+repoint
+acederna
+3061x229
+hdee1d8ccybd
+ibuyitand
+tired
+jswerkman
+10a
+3d7208
+industrywisconsin
+yoshiko
+redrew
+unsubscribefrom
+6pm
+jerusa
+guge
+brinconsult
+tujzvlaxbo7mzdkkog
+16259
+a10044a53692a70421326a3
+ccbl
+consistenc
+3d6331
+efbf0bc8et0blu0bii0a5
+fontina
+ices1
+kinnan
+consequent
+928989
+bipolar
+rtd1
+hb4641373293x1127639x80979x
+olombia
+25598
+jlorenzen
+chrisl
+pbw19k
+arrv
+aaaaaaaaaaeah3mdggeacqt
+9671800
+idrxtvyj
+aigi
+asthenia
+remec
+outbind
+mailinyd15
+stipanowich
+marnier
+unifyprod2
+gpsd
+awhlzrmf8b5le7ko
+yarh061024d0c60f8c7c
+tatum
+mekelburg
+yadav
+enron
+bvio
+luther
+bellosguardo
+veesq2o5ec0zxv
+flockhart
+mverwegen
+36336
+drt
+lawlor
+beqqcaaiaaekidgabqahgdpaaeaagaa
+saidia
+7zj
+edni0bejkz0n50reu0az
+09silver
+hansi
+09moscow
+langer
+56k5
+hncl0bpryj0gru0dq80ak
+9l
+veronica
+pantani
+fasil
+slayman
+hgmasti
+brockan
+printf
+chiendao
+dtang
+hasbrouck
+hb4521275355x1111943x79635x
+09cook
+pittma
+budmail
+nikkia34
+juvan
+overshadow
+10006a
+sv2id
+haubner
+anwendungen
+haymon
+jbrewer
+800391e
+samuelsrk2
+yuhn
+cale
+eb3130c
+elcher
+gmsaw
+gries
+sichel
+unwirelogin
+itain
+fesharaki
+419741
+lqdx
+vogelfang
+holl
+willowbrook
+guest3
+afrankfort
+sabel
+xtm
+emmett
+drkw
+wildca
+4qvp5q
+0mmcf
+shepherdw
+minemet
+ers
+mm
+15e9b838178776
+winescabernet
+hodsonta
+marroquin
+mcgarrett
+dn6
+193912
+owser
+jamal
+wndp
+kraul
+ieqtndx5ec5crm
+ruoffj
+133233
+afteroon
+snmp007
+childless
+household
+2101389
+fergie3
+winnfield
+uav
+newspaerson
+poential
+melond
+sefchick
+u423fxqlaxgfodx50ebx8avr
+standand
+dlab
+smoothscan
+hovenduck
+devonian
+09expedia
+satx
+iogr015
+phsical
+dakarai
+5457
+33am
+quillen
+568860
+rewind
+elberg
+t018176
+15446
+fever
+aaalap8aaadwaiabkwaiahaadqaaaasa
+patick
+klac
+li41400
+0847p
+mscgi
+kavanagh
+koradi
+40569
+x31583
+kornikova
+lat
+mesb
+salalah
+ellefson
+bdal
+scull
+utsunomiya
+utpal
+stry
+y9rh06125398c60f8c7c
+3d7286
+dvereb
+8ahq
+ruscettit
+friedhoff
+1426879
+bparlin
+ultar2
+454aaa733bb6d211bf4000a0c9dfb8c13b7662
+deathstar
+friedan
+detzel
+ilknur
+gsm1900
+wup
+lramirez
+adamow
+iaian6
+webpub
+dirtiest
+8acaiuaaax
+pme8
+77573
+8381
+coralenehol
+1113095112
+westphalia
+vidov
+sivb
+lipari
+mesko
+sxcarril
+bentoumi
+209638
+cicherillo
+xo
+w5ku
+48959
+09hdrider3840
+christin
+7451
+ebouillo
+s4i
+tahquamenon
+dameia
+8492
+andermatt
+mawaw
+scottagoff
+goergia
+nohea
+masatsu
+transprov
+acfektfacf1g6mtbsqoxz9rmqnktpg
+2724684
+ebef3ar10416
+negroni
+ftsa
+fhlmc
+09poland
+pragai
+shae
+fabiola
+capoisl
+1452631
+break
+36798
+eol459929
+raap
+pelas
+8morgan
+x39859
+brotto
+dunkirk
+h1968571001x828068
+ee610bc8et0blu0bdyu0aa
+40m
+412626
+gielda
+belgaum
+filling
+30386
+hundredth
+roast
+viu0oaazuizjtmyb
+96021339
+komitet
+zgx
+bhmwnhou
+afo9zk51z
+petroli
+joeysoriano
+eloff
+136x
+milar
+brickfield
+eariest
+tradinf
+1458283
+snoehvitconsortium
+refd
+slep
+govenar
+aj5bxiuxvzj3luqxknn3ozfk
+4yr
+dwohl
+contend
+abdusalam
+snydere
+mjmcbride
+oprah
+truth
+cofer
+jump
+0282
+hb4530686089x1012795x79837x
+fryed42
+r6241
+25616
+1200d
+tacomoa
+reja
+vifl
+2503430
+mweisfeld
+morkel
+0261
+22guarino
+jjfrommelt
+sandbar1
+nowiki
+ertel
+hilman
+ng0418
+terrupt
+004968
+6ql
+5914
+clayoquot
+09griffith
+mremick
+pmsi
+temptest
+tjgross
+mvv
+exoticswap
+ooccff
+mwsolomon
+arvidson
+bqabfwaeaayagwatab8a7weaairekwh
+00529a
+haliburton
+anmacpherson
+kalbag
+remplelm
+w5wqxhjvvnrb6nzx857pfpzo2qmofvzn
+124109
+go1
+karlovich
+ericgraffp
+tmumaw
+benlatino
+40txu
+67698715
+9242
+136485vr3
+38420
+dbl61
+testiest
+25540
+321dth
+synder
+comic
+vvs2
+sharpest
+9041
+smadja
+wfea
+lawsui
+kjroeker
+wnedkeith
+185676
+jmcgrane
+thorsen
+toi
+brandstream
+enth
+creelj
+makeour
+rul9pdw4
+hortinela
+069
+chdx
+kophamel
+puc1
+stoic
+buylist
+09unger
+stler
+beindorff
+htmiozwfmdfneysp
+chipk
+chanukkah
+yment
+002813
+1453212
+01a
+ccyaeej
+studdard
+410615
+dimeff
+jzeller
+sumac
+55bj84
+visist
+2695
+qws3270
+aqagaaaaiaaaap
+a14109a28178a62891954a0
+maekawa
+59629
+esgo0205
+interntnl
+eisc
+dss501
+basmati
+58208
+longo
+96036535
+arba
+jerez
+etcinc
+0063878
+rellis9747
+9758
+31858
+vaiaaaaaaaafaueacgbpageabaaxaboayaaaap9
+greenspoin
+37302
+etsmorningreportfdd
+hb5244659747x1198151x90792x
+4806796
+nvest
+rgree
+r97058b
+vgp
+pnra
+648125
+168454
+omagh
+kbollig1
+elosua
+495k
+birko
+brookem
+7f1d7f2194b0e34989ec0997380b6683644891
+12958
+4b5d
+daversa
+01pm
+phileo
+csilla
+ebm
+ppm200
+staffin
+trepl
+7138530484
+2513987
+3d231041
+95001509
+citigro
+09wesner
+vhsj
+09domain
+kuyatt
+lpm
+herriff
+jwhitacr
+0922a0
+dortman
+02c2
+colora
+godz
+condesa
+hoekema
+boma
+8aaaaapgaaacia
+tylessuzanne
+ajout
+teresa
+3d186701
+sedlacek
+baack
+528582
+666306
+messageid
+rosean
+ddgtq
+greatmurra
+hobson
+1545
+louisg
+ambassad
+11115
+vpcrlxkylu4ni
+roses4
+branman
+cougar
+f5d
+34302
+x83
+09vignaroli
+etype
+avidjivd8iryj1fsby2s6ablzq
+rbrennan
+72133
+09condado
+31200
+knockj
+waylaid
+asileira
+uj0dfud8p
+invertica
+gigliotti
+cshurter
+hinan
+egrp
+startrupr9
+pilch
+janderson
+amazon
+unpayable
+donlan
+urbanek
+209628
+isleta
+jbonina100
+proligo
+09abler
+mjjljlhnii
+mar01
+mnlf
+207496
+g0e
+5616
+chelmford
+f8ydkt7thqddo
+7686
+poff
+monicasnideman
+ainian
+t00
+hamto
+lesniewicz
+kazex
+ladanian
+91161
+160989
+c1492763l6977u62309
+fve8gvyhpit9lt
+mpur
+2727633
+guerra
+eo8g0cnuzr0gkl0fjl0ad
+vrode
+26sq
+financialc
+ktrh
+soleilt
+upson
+ruettger
+ac25
+berxztyzec9sqc
+3dlmay2
+muscado
+pumpngd
+lewkowicz
+em22ffj1
+nadler
+dharder20
+trachtabel
+simplest
+potenza
+carruth
+8ish
+3467
+euclidm
+3d6648
+mailinye45
+cajun
+000000000078936
+drivin
+389159
+107848
+brr195m
+me1q0ea6bm0bo50bci80b5
+2766
+500282
+q2n2uggs8c0z
+devour
+1445524
+02oct
+a16366a49675a99406973a3
+xiotech
+brotherss
+fcckpxgngd8ukyq
+c22
+cspn
+448835
+mkreaqa5eczxrv
+trickster
+0290
+www0v
+portner
+pitt
+3ddsinsab
+wholesal
+distribuion
+concluiu
+tieu
+151880
+youwintrivia
+dingram
+whinner
+gsharfma
+ltrmq
+wersj
+destacaram
+f3u1p37
+61474
+0886777674
+tearpock
+dlw
+stelbenr
+gerno
+nyrcp
+grm8
+dny
+eb23k1
+nexturl
+101033
+01474
+oem0bpryj0gavo
+c1492145l4667u62309
+sl2
+milieu
+cowperthwait
+ykdgiggh4sfiouiio
+trigger
+32603
+pourang
+dbreithaupt
+499863
+h4hqq0o696n
+europen
+powersmart
+tgarvin
+antiterror
+k7970
+mcg
+kott
+8caucaaqaa
+fargen
+25555
+oppenheim
+525925
+1705043987
+deepen
+006301c02286
+appollo
+09heintzelman
+wildcat
+maneu
+a15805a49335a84715283a2
+9mw
+mandelbaum
+f318
+perrigo
+d2400uf
+warbler
+3684
+idac
+09stu
+9438
+09dietz
+kiff
+tudon
+fn30
+dobson
+judyb
+09centilli
+x2x5el
+cauthen
+2300mw
+northpoint
+tze
+huddleston
+147852
+buston
+4e8da4e5fec96b419fcc16e7bf298fe209e57a
+mckennon
+shuang
+moonema
+270k
+bfinkelstei
+picciarelli
+grabst
+encarcion
+jmcglothlin
+rasteau
+shellgallo
+utilitarian
+hb4530686089x1111944x79837x
+jwallen
+monarch
+eb3143c
+160b
+transfo
+863626
+raid
+haunasnow
+53am
+oechsler
+7b5d0f1d1d
+04578
+marthafromtn
+alengberg
+torreano
+9767
+10501
+promomail
+arello
+overr
+peaki
+ghodgkiss
+332p
+c1492805l7748u62309
+stenglein
+thy
+p9i6b
+deerfoot
+tspecogna
+galmal
+20grace
+pdii
+71354
+r36e
+8854
+12921
+inturn
+yvhz
+facto
+695469
+windtech
+milliontext03
+04794
+09bob
+676780
+986563
+cherronef
+scotiamoccatta
+clickathomecanada
+citgo
+ambar
+grannivan
+7138531761
+53f
+csfbi
+stanwood
+palinview
+0001045243
+rm68
+411392
+kctu
+411394
+452637
+487238
+cad
+toffler
+tmpnam
+29291
+dh116248
+jt901
+elu
+mjurosek
+heigth
+choltman
+771328176
+382610
+oynkznhfqeiyohwq
+koroniwskyj
+opd
+tipton
+wobec
+birth
+09geoff
+larmar
+roach
+lcm
+vwqhnmjhnliix
+dianeg
+governar
+johnsmith
+exxon
+citrokn
+24386
+shepdc
+zqy6f958
+dallaschic34
+sedlak
+135846
+34316
+avatar
+mefyor95eckkqz
+aaaaaaaaaaaaaaaaaaeawkyokgeacqt
+20011020
+soar
+abmurawski
+crudest
+kosten
+spafinder112001
+jacknetek
+squander
+845a
+eetm0bc8et0blu04ph0am
+01c0d75d
+midyear
+bors
+eelam
+sangamo
+09ahmadi
+interi
+jprospero
+donalo
+vdar
+nevi
+100556
+1452826
+6319316
+purveyor
+691156
+ashook
+510986
+getawayclick
+tinitonnu
+cal2005
+wtangb
+meo2
+15027
+rufburt
+alevich
+560104
+informio
+3048
+ob8
+525151
+bruggeman
+semack
+bobjohnson
+primelinesportsbook
+426
+rothbaum
+lizstock
+182603
+3817
+affarsstrategerna
+3d6747
+1452652
+suvit
+ehtiiqmu
+a10049a44888a92913525a1
+plov
+bkhy6unsubscribe
+aaaggghhhhh
+0867
+jhoverl
+mvlg
+rochmanm
+navy2
+eggebrecht
+acon
+cochranv
+40heinassoc
+hellstrom
+burbank
+chanaba
+3837a
+kinard
+09kinder
+openi
+cm72t
+fergerson
+realchip
+7112275
+sob
+counihan
+74023
+lavar
+windcrest
+aaaagaaaafia
+7112279
+sholeen
+samek
+09aqmd
+northpoi
+micromirror
+130305
+33rd
+mvana134
+knkow
+bankcard
+312613
+fight
+cruxificion
+gid
+winfastr
+06492
+janj
+5867
+144292
+joetracym
+talenta
+57798
+flombar
+09yuck
+c3fb8ca9
+princii
+aaoaeqaaagkaigaaap0acgaraaeaawaiaaaa
+corphq
+cide
+9970625
+55869
+pp2
+atricia
+encarta
+snowj
+cadyharriet
+229
+ormhzq
+mainzer
+brikmstr
+aza
+139107
+sstype
+kreiser
+mth
+hb4815663829x1152972x84733x
+ntion
+curranac
+fuckign
+adorn
+featur
+c1492783l7151u62309
+tkxelfdtnb5
+connectivit
+shinea
+oravec
+c1492805l7749u62309
+130796vr3
+s053022000156039
+dishongh
+ssloan310
+80490
+subsist
+kha
+tpmc
+trip
+jons
+vbedingf
+4120j
+2031525
+zani
+14pm
+x30442
+hexdnref
+12133780
+mhexqvy13vxtuevgv5q1ie5k
+rotabi
+september27
+ezula
+a16366a99406973a2a50774
+xkr
+qakadaa
+459985
+mcglade
+ee8d0bc8et0blu0bedc0an
+edidson
+cs02
+10172
+48200
+hub210e25
+7qq
+1205827785
+blitzen
+story14414
+14515
+0318139
+burbon
+exner
+ellum
+wazzzup
+transferu
+alaskaair
+nmg1la1d
+x58463
+fsc
+greenija
+y81311
+ottawa
+salu
+raafab4a
+iuliani
+feb50c
+lockdown
+404095
+jhduubeqmohsmfljmdlgkhgdjhte0euv
+877k
+0134
+tanaska
+perwien
+amarchetti
+qakaaiacwbaaekaaab
+2291425
+eralda
+axcan
+livelihood
+osh
+eksten
+bfasf
+battli
+fayette
+dumlao
+barkan
+cny
+sega
+renderin
+agoajqaoabgaro9zap0acgamaaaatqapaaaa
+gilst
+7300
+metrpolitan
+boxc226332g4
+totrack
+b00005byi3
+1944
+msoplaintext
+voye003
+editori
+brofman
+specht
+toniandmikeg
+realmarket
+proscenium
+syracu
+fgababsaawb
+lrb
+1919696
+llewellyn
+franksen
+5jauwrnzaxcqs6jhd
+dwaaaaaaaaaaaaaaaaaaaaabaj0w
+souri
+74243541
+5fwhite
+bkeller
+chge
+jarani
+sgw1
+411384
+8bde02c3f545b36f
+dbutler
+kcsm
+jmwilson
+3dddavis4
+camisha
+964443
+dykman
+chrusciel
+y0rh0614b3ef23fed379
+39740
+reisor
+thein21
+postu
+hb4827849593x1150579x84421x
+09calo
+realtionship
+efcs0bc8et0blu0beah0am
+lefton
+ashtra
+68535988
+470563
+techdoc
+wastin
+meador
+mikedfw
+jgoodpa
+enchcoln
+36349
+assista
+purchasin
+gqc
+c1492435l6010u62309
+rybqthjfw
+115101
+minimiz
+campana
+pwiselogel
+jpsale
+69of
+familialopez00
+180cst
+435p
+murnan
+ug1yql
+stressful
+oejunkm10acw4sark1g4wrqw
+bgabaaoahwc2agaabf0raf
+rneffpccnyc
+3d207916
+cvanpelt
+tmcandrew
+hanifi
+1018
+apoplecti
+917p
+ybrh0616337ac60f8c7c
+eb2988
+electrico
+1230
+3d227
+6007
+melinchon
+ecorp
+richards3
+f51lmc608402
+gawk
+180492
+40448
+fiilter
+12ea
+osterkamp
+vonova
+harrisc
+v126
+rber
+aircraft
+ster
+boz
+mhunt
+j42lsw15
+trabia
+swalsh
+selfswitch
+koehnk
+101c
+forecastin
+525147
+smithro
+09tijerina
+e0airhnacaaaapad
+boo
+2esbi
+regnet
+deadband
+psiq
+altr
+3d598
+ipa
+stockton
+chrisqb2
+2479201170221160
+shutka
+ncuc
+fdgy
+marjut
+pixi
+rash
+4ykky5
+case1
+spayto
+ceraw
+grimmest
+osterhoudt
+httpd
+1430037
+x57201
+1425577
+cgosain
+haroldf
+09sonya
+leistri
+edmundo
+7803
+x36214
+schmud
+n33351
+0064364
+lharpold
+altsom
+babch
+scaton
+1011326v
+conductor
+promail
+scad
+31957
+ksm
+northcu
+55zr8c
+scratcher
+eevq0bb2pi0blu0bic0at
+kerrd
+tksdmg7o1vnpmjc
+garantir
+x37135
+bansal
+09mihura
+intreraciton
+960635519
+portico
+ibd
+knelson
+mdtc
+currivan
+092027077
+20020103
+eperrigo
+ibp
+cwilliamson
+klionsh
+cisa
+fabianr
+8215b
+fsos47
+c1492805l7741u62309
+pierotti
+basola
+100902
+40pira
+14a0
+saa24750
+hnxc0cl8se0ev70nyq0av
+printformat
+westergaard
+rc
+bradleyromine
+sn2
+spm
+439605
+wuelf
+04540364c
+chadless
+hhrbsyu
+0651
+minczewska
+horse187
+500mcg
+1452404
+y9rh061212f0c60f8c7c
+18336
+churchil
+svandyke
+misstiny24
+lebor
+xbchdfjhde
+shinto
+hutagalung
+36678
+004202
+478946
+tmcasc1925
+477115
+rwhigham
+aog
+c72e469fd563464ea42ac501f8ccb30704749473
+tarun
+23k
+goforward
+beblow
+tchuckel
+nytimes101101b
+interlaken
+hockman
+sab24769
+petschauer
+aasahf8faaecab4abgabaawahwc2agaahf0raf
+mad
+3d159949
+capstonetu
+10697
+roehrer
+986899
+animationatstart
+3d115981303
+zellerbach
+chamroeunk
+141476
+su
+holdenoo1
+sta079010
+27c311a7469fa1d3a0b2343622746a0c14
+123
+stakrit
+stllingwerf
+eb1175
+przyjemnoscia
+url9qml0scptu7sjduczf84vhsrr
+84b56e80
+pc9cte9ds1fvt1rfpjwvqk9ewt48l0hu
+mykoxaphalentooldphyew
+semicondu
+maranjian
+michcon
+lrdrn
+20email
+usacanada
+schriber
+promedex
+shaka
+x33488
+cybe
+411715
+approa
+veena
+nimh
+ttlem
+ntmail
+jquenet
+ecn46c1
+swane
+ausgleichsbank
+ellinghaus
+4g
+311916
+ractual
+hewer
+akhal
+2bboston
+holsten
+egm50sgo10cz40nfi0am
+manweb
+denyer
+introduci
+eb3883
+33726
+33095
+blackford
+4a18ec10
+markwest
+835119
+enaupstreamconfirm
+crackapo
+dec2397
+9703
+1300mmbtu
+davisl
+890mw
+droz
+68211
+ssalkow
+fqian
+mhendrick
+78248
+loin
+trainwreck
+audiosonix
+waaaaaaaaesaagceaadaaaa
+77000
+amiel
+1133521
+apu4p9fmvbvh7u6gdxpz3cgdgkrdpitn06
+redraw
+enuf
+beatriz
+35509
+dederi
+136486vr3
+gtacrec3
+zdziebkor
+or1
+organizat
+lizabeth
+myrman
+textmaincopy2
+14203
+busta
+amaretto
+ep
+difficil
+kenb
+rski
+1446253
+1en9x8env4p9a7pbyh1chphnfw
+157747
+1446257
+2516859
+nner
+301882
+tcarrico
+worldnewstonight
+en8y0dlbdp0gzt0egw0ac
+oeri
+blh
+kjstreet
+bceaaaaaaaaaaaaaaaaaaaa
+kaprielian
+ag4adqaiabgazvfkyd1r
+695025
+1138
+409469
+simila
+coisa
+vernment
+lmr
+accomp
+8641x
+prout
+brzozowski
+efbe0dwlk30bp205jv0ai
+carn
+juden
+constr
+shearmur
+kof
+bafall2001
+hvload
+ecoburn
+punc
+plyr
+telenovela
+chiasson
+hamek
+nt6155
+eetm0d4s5i0blu04o40ai
+wrongdong
+jbrock
+danilow
+ritazza
+wicek
+133272
+945b38e798abd4119fdf0000f6b61a8d3b32e0
+30pmsharp
+244rt
+650mm
+79198
+4189
+mucha
+saviolo
+g3cnq
+noticiada
+1130ish
+xc
+1004093003
+rachel
+symbolic
+wbjordan
+chump
+m355943
+tenia
+telm
+servercodemanagerview
+xp
+fcruz
+00pdf
+methompson
+euo6b0
+preiten
+signator
+silent
+dudleymight
+fmv
+sshupe
+gastner
+raiderdon81
+shattuck
+dawnn
+erdata
+elkhorn
+ukh
+x73206
+er94
+7136679556
+v300
+ehusami
+kcqbactivebyeweek
+tommaso
+qhogenkpmmpmoqlgkhgejht
+3872
+siz1
+bissonn
+poizonbox
+blacklist
+optinel
+dannyg
+2303845
+2728256
+everythi
+e1341
+jamescox1
+comerchero
+moryl
+3d237380
+zucha
+boyfriend
+badenhorst
+rolandrod
+erwong
+132456
+voelkel
+59a07821
+dtiwxfut8qtfmod9zpypj96iv2koumnbqiflcf9
+jhdcteqmohsmflgkhgdjhte0eut
+snoozer
+dmonth
+319sd
+ventura
+dem001630
+jlewis99
+438338
+baaaab4aawaaap0acgaeaaeahgaeaaaa
+sitework
+tamu
+183028
+endata
+jrod
+chasewood
+kwsargent1970
+kaloogian
+prb
+pennyhughes100
+rowhauer
+0ga900dzdvazzx
+confortavel
+penalti
+licz
+35645
+haghpeykar
+pai1
+77796
+marathon
+opsi
+freshfield
+highflier
+chuckdavisuva
+2048296
+ayembee
+3dactiveusah
+0zx158
+714097
+ummph
+9301
+lhoffman
+psalmno131
+103242
+632978
+yereth
+chiller
+nebr
+tejasgregg
+mycasa
+4msvbn
+pescetti
+pernot
+13227ambaum
+trut
+shake
+harlen
+khater
+pr2
+20molina
+09infineon
+stinton
+falla
+dasexton
+fantom
+epri
+404415
+delena38
+enershapir
+seafood
+sidekick
+ramakrishna
+ebaughm
+recox49
+bvana
+sunnynl
+ulmeden
+8fa1
+efii
+30771c
+txlcaa
+meico
+p21301
+55zqxh
+7813
+georgievski
+85391
+gnapi
+kwon
+marcon
+nybabe4life84
+fedor
+sylv
+3654
+corner
+snider
+3d2285
+hmlangetx
+dica
+cadechiasson
+162372
+robrogowski
+alaw32
+1452583
+61875
+135664
+energydata
+8387
+4494
+consultng
+marctronzo
+slob
+1h96er
+ciotoli
+karolinska
+urodzonym
+42386
+wynter
+wysoki
+000000000059240
+debner
+3213c
+tekbilek
+3d182770
+contracto
+ssh