9
$\begingroup$

I like using memoization (i.e. the construct myFunction[x_]:=myFunction[x]=...) when I have a heavy function that I need to re-evaluate on the same arguments. However, I find it frustrating that each time I quit the kernel(s), all the advantage goes lost.

Is there a way of saving the results? I can think of a very cumbersome way of doing it, such as this block upon defining our function

memo = If[FileExistsQ[FileNameJoin[{Directory[], "memo.mx"}]], Import["memo.mx"], {}];
myFunction[x_] := Module[{value = ...},
AppendTo[memo, "myFunction[" <> ToString[x] <> "]=" <> ToString[value]]; 
Export["memo.mx", Union@memo];
myFunction[x] = value]
Evaluate[ToExpression/@memo];

Is this okay, or is there a better (or even designated) way of doing this?

$\endgroup$
  • 2
    $\begingroup$ And DumpSave? $\endgroup$ – unlikely Feb 19 '15 at 17:16
  • $\begingroup$ I guess that does it! (I'm checking) $\endgroup$ – Ziofil Feb 19 '15 at 17:17
  • $\begingroup$ Yes! Thank you :D $\endgroup$ – Ziofil Feb 19 '15 at 17:22
  • 2
    $\begingroup$ @unlikely Can you post an answer? $\endgroup$ – Szabolcs Feb 19 '15 at 17:43
12
$\begingroup$

Not much different from your approach and maybe not the best/safest approach, but DumpSave helps a bit because at least you don't have to works with strings:

cacheFile = FileNameJoin[{$TemporaryDirectory, "fibonacciCache" <> ".mx"}];
If[FileExistsQ[cacheFile],
 Get[cacheFile],
 fibonacci[1] = 1;
 fibonacci[2] = 1;
 fibonacci[n_Integer] := Module[{},
   fibonacci[n] = fibonacci[n - 1] + fibonacci[n - 2];
   DumpSave[cacheFile, fibonacci];
   fibonacci[n]
   ]
 ]

For example

In[3]:= fibonacci[500] // Timing

Out[3]= {0.562500, \ 1394232245616978801397243828704072839500702565876973072641089629483255\ 71622863290691557658876222521294125}

Now Quit[]-ing and reevaluating the previous cell:

In[3]:= fibonacci[500] // Timing

Out[3]= {0., \ 1394232245616978801397243828704072839500702565876973072641089629483255\ 71622863290691557658876222521294125}

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.