Container Array

Vino.B via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Sep 8 05:14:46 PDT 2017


On Friday, 8 September 2017 at 09:51:38 UTC, Ali Çehreli wrote:
> On 09/07/2017 11:21 PM, Vino.B wrote:
>
> >   At last was able to print the output, but i am getting some
> > "Deprecation" warnings like below and also can you help me in
> formating
> > the output to display ulong.
> >
> > Output:
> > Size.d(9): Deprecation: std.container.array.RangeT(A) is not
> visible
> > from module Size
>
> That's due to std.container.array.RangeT being private. The 
> deprecation warning is about a bug that leaked such private 
> symbols when they were imported selectively (I think). Now the 
> bug is fixed, you won't be able to access the symbol at the end 
> of the deprecation period.
>
> > import std.algorithm: filter, map, fold;
> > import std.container;
> > import std.file: SpanMode, dirEntries, isDir;
> > import std.stdio: File, writefln, writeln;
> > import std.typecons: tuple, Tuple;
> > import std.parallelism: parallel;
> > import std.conv;
> > import std.range;
> > Tuple!(RangeT!(Array!(Tuple!string)), RangeT!(Array!ulong))
> > coSizeDirList () {
> >     string FFs = "C:\\Temp\\sapnas2\\BACKUP";
> >     int SizeDir = 1;
> >     ulong subdirTotal;
> >     ulong subdirTotalGB;
> >     Array!(ulong) Subdata;
> >     auto dFiles = Array!(Tuple!(string)) (dirEntries(FFs,
> > SpanMode.shallow).filter!(a => a.isDir).map!(a =>
> tuple(a.name)));
> >     foreach (d; dFiles[]) {
> >                 auto SdFiles = Array!(Tuple!(ulong))
> (dirEntries(d[0],
> > SpanMode.depth).map!(a => tuple(a.size)));
> >                 foreach(f; SdFiles[]) { subdirTotal +=
> f.fold!((a, b) =>
> > a + b); }
> >                     subdirTotalGB = (subdirTotal/1024/1024);
> >                     if (subdirTotalGB > SizeDir) { Subdata ~=
> > subdirTotalGB; }
> >                     subdirTotal = 0;
> >             }
> >             return tuple (dFiles[], Subdata[]);
> > }
> >
> > void main () {
> >     writeln(coSizeDirList[]);
> >     //writefln("%(%-(%-63s %)\n%)", coSizeDirList[]);
> > }
>
> I apologize for not really having time to look at what you're 
> trying to achieve. I gave you advice which ended up trying to 
> solve compilation errors.
>
> I think the main problem here is to determine directories above 
> a certain size. So, I think Array should enter the picture only 
> if built-in arrays are not usable for some reason. Even better, 
> one should stay with lazy range algorithms as long as it's 
> possible.
>
> How about the following approach, which you can either use 
> directly or populate an Array with:
>
> import std.algorithm: filter, map, sum;
> import std.file: SpanMode, dirEntries, isDir, DirEntry;
> import std.stdio: writeln;
>
> auto dFiles(string dirName) {
>     return dirEntries(dirName, SpanMode.shallow).filter!(a => 
> a.isDir);
> }
>
> auto totalSize(DirEntry dir) {
>     return dirEntries(dir, SpanMode.depth).map!(a => 
> a.size).sum;
> }
>
> struct DirInfo {
>     string name;
>     ulong size;
> }
>
> auto coSizeDirList (string dirName, ulong sizeLimit) {
>     return dFiles(dirName).map!(dir => DirInfo(dir.name, 
> dir.totalSize)).filter!(info => info.size > sizeLimit);
> }
>
> void main () {
>     writeln(coSizeDirList("./deleteme", 1));
>
>     // Only if Array is really needed:
>     import std.container : Array;
>     auto arr = Array!DirInfo(coSizeDirList("./deleteme", 42));
>     writeln(arr[]);
> }
>
> Ali

Hi Ali,

   As stated earlier my release 1 code are still using std.array, 
so now in release 2 i am converting all my standard array to 
container array. My program has 5 function and I was able to 
adopt 4 function to container array, and facing issue with this 1 
function. I would like to have all my function to be neither in 
standard array nor in container array, more over I am facing gc 
issue in standard array and this is the main reason I would like 
to convert my function to container array, as this function would 
find the size of folder which are greater then a specified size 
in a 5 file system each with 10 TB, so i have added the 
thread(with Local storage) and parallelism to my function as 
container array give's me the option of reserving memory, so that 
i would bump it up as and when it is required with any gc issues. 
All help to resolve this issue would be appreciated.

Updated Code:
import std.algorithm: filter, map, fold;
import std.container;
import std.file: SpanMode, dirEntries, isDir;
import std.stdio: File, writefln, writeln;
import std.typecons: tuple, Tuple;
import std.parallelism: parallel;
import std.conv;
import std.range;

Tuple!(RangeT!(Array!string), RangeT!(Array!ulong)) coSizeDirList 
() {
	string FFs = "C:\\Temp\\sapnas2\\BACKUP";
	int SizeDir = 1;
	ulong subdirTotal;
	ulong subdirTotalGB;
	Array!(string) Subdir;
	Array!(ulong) Subsize;
	Tuple!((Array!string), (Array!string)) Result;
	auto dFiles = Array!string ((dirEntries(FFs, 
SpanMode.shallow).filter!(a => a.isDir))[].map!(a => a.name));
     foreach (d; dFiles[]) {
				auto SdFiles = Array!ulong ((dirEntries(d, 
SpanMode.depth)).map!(a => a.size));
				foreach(f; SdFiles[]) { subdirTotal += f; }
					subdirTotalGB = (subdirTotal/1024/1024); { Subdir ~= d; 
Subsize ~= subdirTotalGB; }
					if (subdirTotalGB > SizeDir)
					subdirTotal = 0;
		    }
			return tuple (Subdir[], Subsize[]);
}

void main () {
	writeln(coSizeDirList[]);
}

From,
Vino.B


More information about the Digitalmars-d-learn mailing list