Container Array

Vino.B via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Sep 8 08:48:47 PDT 2017


On Friday, 8 September 2017 at 12:14:46 UTC, Vino.B wrote:
> 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

Hi Ali,

  Was able to resolve the above issue but not sure whether it is 
correct and now i am getting the output as below, request your 
help.

Output:
C:\Temp\sapnas2\BACKUP\dir1, 34, C:\Temp\sapnas2\BACKUP\DND3, 1, 
C:\Temp\sapnas2\BACKUP\DND5, 5

Required Output:
C:\Temp\sapnas2\BACKUP\dir1                34
C:\Temp\sapnas2\BACKUP\DND3                 1
C:\Temp\sapnas2\BACKUP\DND5                 5

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

Array!string coSizeDirList () {
	string FFs = "C:\\Temp\\sapnas2\\BACKUP";
	int SizeDir = 1;
	ulong subdirTotal;
	ulong subdirTotalGB;
	Array!(string) Subsize;
	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); { Result ~= d; 
Result ~= to!string(subdirTotalGB); }
				if (subdirTotalGB > SizeDir)
				subdirTotal = 0;
		    }
			return Result;
}

void main () {
writefln("%-(%s, %)", coSizeDirList[]);
}

From,
Vino.B


More information about the Digitalmars-d-learn mailing list