Here is an update where I compared the image extraction (8bit, 1 channel) from two AVI files:

My computer (Mathematica 11.0.1, Win 10 Pro, Intel i7 7490-MX, 3.1GHz, 4 cores) has 16 GB RAM and it never used in total more than 5 GB RAM, all running processes included.
The code can be used for multiple AVIs in different subdirectories in a certain base directory:
(* Read in folder which is base dir to search for avi files in all subdirs *)
ChoiceDialog[{FileNameSetter[Dynamic[baseDir], "Directory"], Dynamic[baseDir]}];
SetDirectory[baseDir];
aviNames = FileNames["*.avi", baseDir, Infinity];
numberAVIFiles = Length[aviNames];
aviDirs = DirectoryName[#] & /@ aviNames;
pngBaseDirs = FileBaseName[#] & /@ aviNames;
pngFullDirs = Transpose@{aviDirs, pngBaseDirs} /. {a_, p_} :> StringJoin[a, p];
(* Create a new directory for pngs if it does not exist otherwise delete it and create a new one *)
(If[DirectoryQ[#], DeleteDirectory[#, DeleteContents -> True]; CreateDirectory[#], CreateDirectory[#]]) & /@
pngFullDirs;
Do[
numberImages = Length@Import[aviNames[[j]], "Frames"];
ParallelDo[
image = ColorConvert[Import[StringJoin[aviNames[[j]]], {"Frames", i}], "Grayscale"];
fileNameCounter = ToString@PaddedForm[i, 6, NumberPadding -> {"0", ""}];
Image`ImportExportDump`ImageWritePNG[
StringJoin[pngFullDirs[[j]], "\\", pngBaseDirs[[j]], "_", fileNameCounter, ".png"], image];
fileName = StringJoin[pngBaseDirs[[j]], "_", fileNameCounter, ".png"];
, {i, 1, numberImages}
];
, {j, 1, numberAVIFiles}
];
{{1, frame1},{2, frame2},...}
and process this in parallel. Still, it is not sure that this will work. $\endgroup$