Hmmm.  One rather drastic option might be to ditch the storing of the information in `data` as a NumPy array of strings, but rather store it as a list of lists constructed from rows in the FITS_rec.  Something like
```
self.data = [[i for i in data.item(j)] for j in range(len(data))]
```
was what I thought might work... A list of lists is picklable, we save on the string conversion, and it means that records (i.e. rows) can trivially be different lengths on an object by object basis. 

A significant downside is that subsequently data must be queried via `data[row][col]`, and getting all elements in a field will be painful.  This sort of problem is one of the reasons Erin rolled his own FITSIO package I believe.

...And finally testing the snippet I suggested above on my laptop for a FITS data table I had lying around showed that this was not super quick either:
```
In [34]: len(data)
Out[34]: 43711

In [35]: t0=time.time(); dtmp = [[i for i in data.item(j)] for j in range(len(data))]; print time.time() - t0
0.73561501503
```
So for a data table of len ~ 40k this still took a second, and has the problems identified above.  Not ideal!