raminfo.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # a simple tool to examine sphinx rt index .ram file
  2. import sys, struct, os
  3. def get_dword(f):
  4. return struct.unpack('I', f.read(4))[0]
  5. def get_id(f, id64):
  6. if id64:
  7. return struct.unpack('Q', f.read(8))[0]
  8. else:
  9. return struct.unpack('I', f.read(4))[0]
  10. def skip_vec(f, entry_size):
  11. f.seek(get_dword(f) * entry_size, 1)
  12. def main(argv):
  13. if len(argv) < 2:
  14. sys.stderr.write("usage: raminfo.py <filename.ram>")
  15. return 1
  16. if not os.path.exists(argv[1]):
  17. sys.stderr.write("ERROR: file %r not found!" % argv[1])
  18. return 1
  19. f = open(argv[1], "rb")
  20. print "examining RAM chunk %r..." % argv[1]
  21. id64 = get_dword(f)
  22. if id64!=0:
  23. id64 = 1
  24. next_tag = get_dword(f)
  25. num_segments = get_dword(f)
  26. print "%d segments total, %d-bit ids, next free tag %d" % (num_segments, 32*(1+id64), next_tag)
  27. if num_segments>32:
  28. print "WARNING, unexpectedly many segments, displaying first 32 only"
  29. index_minid = 0
  30. index_maxid = 0
  31. total_rows = 0
  32. total_alive = 0
  33. for i in range(1, num_segments+1):
  34. off1 = f.tell()
  35. tag = get_dword(f)
  36. skip_vec(f, 1) # keywords
  37. skip_vec(f, 1) # checkpoints1
  38. skip_vec(f, 16) # checkpoints2
  39. skip_vec(f, 1) # docs
  40. skip_vec(f, 1) # hits
  41. rows = get_dword(f)
  42. alive = get_dword(f)
  43. off2 = f.tell()
  44. skip_vec(f, 4) # rows data
  45. off3 = f.tell()
  46. rowsize = (off3 - off2 - 4)/rows
  47. f.seek(off2 + 4)
  48. minid = get_id(f, id64)
  49. f.seek(off3 - rowsize)
  50. maxid = get_id(f, id64)
  51. f.seek(off3)
  52. skip_vec(f, 4*(1+id64)) # klist
  53. skip_vec(f, 1) # strings
  54. skip_vec(f, 4) # mva
  55. skip_vec(f, 8) # infixcp
  56. xrows = ""
  57. if rows!=alive:
  58. xrows = " (alive %d)" % alive
  59. if i<=32:
  60. print "seg %d at off %d, tag %d, rows %d%s at off %d, %d b/row, ids %d..%d" % (i, off1, tag, rows, xrows, off2, rowsize, minid, maxid)
  61. else:
  62. if sys.stdout.isatty() and (i % 1000)==0:
  63. sys.stdout.write("scanning segment %d of %d\r" % (i, num_segments))
  64. if index_maxid==0:
  65. index_minid = minid
  66. index_maxid = maxid
  67. else:
  68. index_minid = min(index_minid, minid)
  69. index_maxid = max(index_maxid, maxid)
  70. total_rows += rows
  71. total_alive += alive
  72. print "total %d rows (%d alive), ids %d..%d" % (total_rows, total_alive, index_minid, index_maxid)
  73. if __name__ == "__main__":
  74. sys.exit(main(sys.argv))