diff --git a/src/pio_server.c b/src/pio_server.c
index 13170d3b44fc83e52e76f7bbfd1dfca9edb11194..1998e772074fab7014caa195d594fcebb92f7c0e 100644
--- a/src/pio_server.c
+++ b/src/pio_server.c
@@ -1375,15 +1375,11 @@ writeGribStream(size_t streamIdx,
     : false;
   struct cacheRedist *restrict retained = rxWin[streamIdx].retained;
   struct passDict *varsInPass = NULL;
-  size_t varsInPassSize = 0;
+  size_t varsInPassSize = 0, maxNumVarsAlloc = 0;
   MPI_Aint *displ = NULL;
   const struct winHeaderEntry *winDict = (wHECast)clientBuf[0].mem;
   for (size_t pass = 0; pass < numPasses; ++pass)
     {
-      size_t numVarsInPass
-        = buildPassVarDict(collSize, passes[pass], writtenRecords,
-                           &varsInPassSize, &varsInPass);
-      varRedists = Realloc(varRedists, numVarsInPass * sizeof (*varRedists));
       size_t myRecordStart = passes[pass][collRank].recordAggStart,
         myRecordEnd = passes[pass][collRank].recordAggEnd;
       size_t myAggSize = 0;
@@ -1396,9 +1392,19 @@ writeGribStream(size_t streamIdx,
         }
       else
         {
+          size_t numVarsInPass
+            = buildPassVarDict(collSize, passes[pass], writtenRecords,
+                               &varsInPassSize, &varsInPass);
           int myVarStart = passes[pass][collRank].varStart,
             myVarEnd = passes[pass][collRank].varEnd;
-          displ = Realloc(displ, sizeof (*displ) * (numVarsInPass * 2 + 1));
+          if (numVarsInPass > maxNumVarsAlloc)
+            {
+              maxNumVarsAlloc = numVarsInPass;
+              varRedists
+                = Realloc(varRedists, numVarsInPass * sizeof (*varRedists));
+              displ
+                = Realloc(displ, (numVarsInPass * 2 + 1) * sizeof (*displ));
+            }
           memset(displ, 0, sizeof (*displ) * (numVarsInPass + 1));
           for (size_t varIdx = 0; varIdx < numVarsInPass; ++varIdx)
             {