--PA
"Alex Sheneal" <Alex She...@discussions.microsoft.com> wrote in message 
news:D527AE3C-1199-4A43...@microsoft.com...
> I am dealing with potentially very large pre-existing files (2 TB).  These
> files are proprietary high definition video files.  I am trying to create 
> a
> file mapping object using CreateFileMapping for these files.  The idea is 
> to
> use MapViewOfFile to map the index of the file into virtual address space 
> of
> the process.  I am seeing a problem when creating the file mapping. 
> Letā?Ts
> say I have 2 files (F1 and F2).  Here is some pseudocode of an experiment
> that I did to exhibit the problem:
>
> OpenFile( F1 )
> OpenFile( F2 )
> CreateFileMapping( F1 )
> CreateFileMapping( F2 )
>
> The second CreateFileMapping call will fail with error 1816
> (ERROR_NOT_ENOUGH_QUOTA).  I donā?Tt even have to map any views to get 
Thanks,
Alex
"Pavel A." wrote:
> Which OS?  NTFS or exfat?
> 
> --PA
> 
> 
> 
> "Alex Sheneal" <Alex She...@discussions.microsoft.com> wrote in message 
> news:D527AE3C-1199-4A43...@microsoft.com...
> > I am dealing with potentially very large pre-existing files (2 TB).  These
> > files are proprietary high definition video files.  I am trying to create 
> > a
> > file mapping object using CreateFileMapping for these files.  The idea is 
> > to
> > use MapViewOfFile to map the index of the file into virtual address space 
> > of
> > the process.  I am seeing a problem when creating the file mapping. 
> > Letâ?Ts
> > say I have 2 files (F1 and F2).  Here is some pseudocode of an experiment
> > that I did to exhibit the problem:
> >
> > OpenFile( F1 )
> > OpenFile( F2 )
> > CreateFileMapping( F1 )
> > CreateFileMapping( F2 )
> >
> > The second CreateFileMapping call will fail with error 1816
> > (ERROR_NOT_ENOUGH_QUOTA).  I donâ?Tt even have to map any views to get 
"Alex Sheneal" <Alex She...@discussions.microsoft.com> wrote in message 
news:D527AE3C-1199-4A43...@microsoft.com...
"Alex Sheneal" wrote:
Alex drom me a line at Morantex, we have considerable experience with this 
subject, I cant suggest an answer as I write, but drop me an e-mail reminder 
and I will be happy to see if I can shed light on this, we have numerous 
libraries and in-house tools that allow us to examine this kind of issue in 
depth.
"Alex Sheneal" wrote:
Alex
I assume you are running XP64?
Hugh
"Alex Sheneal" wrote:
Hi Alex
The sizes you are using are very large, 2TB, is 2000 GB. Can you possibly 
establish at what size you begin to see this error code? Does it happen at 
10G? 50G, 100G, 500G etc.
If you can tell me the smallest size mapping that exhibits the issue I will 
try to see if we encounter it at these large sizes.
Hugh
"Alex Sheneal" wrote:
Hi Alex
I now strongly suspect that this error code arises due to the exhaustion of 
OS heaps. Both the paged and non-paged heap play a role here, page tables are 
held within the paged heap and with files of this size a considerable demaned 
is placed upon the OS heaps.
Your problem may be alleviated by increasing the size of your paging file or 
by upping the paged and non-paged pool quota sizes.
By default the OS computes the sizes of these two regions at boot time, 
these sizes can be manually overridden by changing the registry settings. In 
addition the registry may also be used to adjust the quota (the per process) 
usage allowances for paged and non-paged pool, a process that attempts to use 
more than its quota will find the allocation fails (inside the OS).
You need to discover what the per-process quota are for your system.
This article will help you puruse this:
http://support.microsoft.com/kb/177415
Regards
Hugh
> What parameters are you passing to CreateFile and CreateFileMapping?
Here the parameters we're using:
    hFile = CreateFile(
                pFilename,
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_FLAG_NO_BUFFERING,
                NULL
                );
    hFileSection = CreateFileMapping(
                            hFile,
                            NULL,
                            PAGE_READONLY | SEC_COMMIT,
                            0,
                            65536,
                            NULL
                            );
> Are you 
> actually using CreateFile or obsolete OpenFile? Are you opening the files 
> with FILE_FLAG_NO_BUFFERING flag (good) or without that flag (BAD)?
As you can see everything seems correct.
Thanks,
Alex
Thanks,
Alex
"Alex Sheneal" wrote:
Well it is not possible to map anything much bigger than 1 or 1.5 GB under 
XP 32-bit. When you say you have 2TB files, I take it your are mapping 
portions of this?
If you aqctually want to map files in the hundreds or thousands of GB range, 
you cannot do so unless you move to a 64-bit OS.
Hugh
Hi Hugh,
Thanks very much for your offer of help!
From what we've seen, the files have to be fairly big, somewhere around 1984 
GB.  In our test app, the first CreateFileMapping call works, and the second 
one fails, so I assume it's when it's close to 4 TB total that the problem 
occurs.  (Again, keep in mind we're not mapping the entire file into memory.)
> I now strongly suspect that this error code arises due to the exhaustion of 
> OS heaps. Both the paged and non-paged heap play a role here, page tables are 
> held within the paged heap and with files of this size a considerable demaned 
> is placed upon the OS heaps.
The question is, why would simply creating a file mapping use so many 
resources?  There's no reason for so many page tables to be created.  We're 
not mapping the whole file.  To me it really seems like there's some 
fundamental design flaw in Windows (or in NTFS) in which a call to 
CreateFileMapping chews up a ton of resources related to the file size.
> Your problem may be alleviated by increasing the size of your paging file or 
> by upping the paged and non-paged pool quota sizes.
> 
> By default the OS computes the sizes of these two regions at boot time, 
> these sizes can be manually overridden by changing the registry settings. In 
> addition the registry may also be used to adjust the quota (the per process) 
> usage allowances for paged and non-paged pool, a process that attempts to use 
> more than its quota will find the allocation fails (inside the OS).
This would be a last resort solution for us, since it implies everyone 
running our software would be required to make this registry change.
> You need to discover what the per-process quota are for your system.
> 
> This article will help you puruse this:
> 
> http://support.microsoft.com/kb/177415
That's a good tip!  We actually ran OSR's version of PoolMon (PoolTag.exe) 
and we found that when CreateFileMapping() was called on a 1984 GB file, the 
non-paged memory used by "MmSc" jumped from 784 to 7112000 bytes.  The second 
call to CreateFileMapping(), if it had succeeded, would presumably have 
chewed up another 7 MB.  The description for MmSc is "nt!mm - subsections 
used to map data files" so this does seem to indicate that we are exhausting 
system resources with our calls to CreateFileMapping().  This is unfortunate, 
because it also means that CreateFileMapping() is poorly implemented by 
Microsoft, making it essentially useless when dealing with very large files.  
Perhaps this will be addressed in a future version of Windows, but for now it 
looks like we're out of luck.  (We'll likely implement a different solution, 
presumably reading our entire index into memory when the file is first 
opened.)
Thanks a lot for your help...
Alex
I just replied to your previous posts.
We're not trying to map a large section of these large files into memory.  
Quite the opposite, we wish to only map a very small section, typically 6 MB. 
 So address space is not an issue.  Rather, it's the implementation of 
CreateFileMapping that is the problem.  Even when you tell CreateFileMapping 
that you'll be mapping a small amount into memory (via the dwMaximumSizeHigh 
and dwMaximumSizeLow parameters), it still gets overwhelmed by the size of 
the underlying file and dies.  Pity.
Alex
> That's a good tip!  We actually ran OSR's version of PoolMon (PoolTag.exe) 
> and we found that when CreateFileMapping() was called on a 1984 GB file, the 
> non-paged memory used by "MmSc" jumped from 784 to 7112000 bytes.  The second 
> call to CreateFileMapping(), if it had succeeded, would presumably have 
> chewed up another 7 MB.  The description for MmSc is "nt!mm - subsections 
> used to map data files" so this does seem to indicate that we are exhausting 
> system resources with our calls to CreateFileMapping().  This is unfortunate, 
> because it also means that CreateFileMapping() is poorly implemented by 
> Microsoft, making it essentially useless when dealing with very large files.  
> Perhaps this will be addressed in a future version of Windows, but for now it 
> looks like we're out of luck.  (We'll likely implement a different solution, 
> presumably reading our entire index into memory when the file is first 
> opened.)
The problem is: it will be only fixed if you offically report a bug.
So my suggestion is: Contact MS product support and open a bug...
-- 
Greetings
   Jochen
    My blog about Win32 and .NET
    http://blog.kalmbachnet.de/
"Alex Sheneal" <AlexS...@discussions.microsoft.com> wrote in message 
news:AA3A180B-4207-497B...@microsoft.com...
"Alex Sheneal" wrote:
OK I understand now, well this isnt necessarily a show stopper. If you 
examine the systems use of memory using poolmon, you may be able to determine 
the cause and make an adjustment to the registry fields that govern 
per-process quotas for paged and non-paged pool.
With some luck a small tweak and reboot may be all that you need to overcome 
this.
Hugh
Hi Hugh,
The problem is, any solution we come up with along those lines is still 
going to be a band-aid solution.  Nothing is going to get around the poor 
implementation of CreateFileMapping() in the OS.  Even if we doubled the 
amount of non-paged quota, all it would take is a few of these HD video files 
to be open at once, and we'd be stuck again.
The solution is to simply avoid using CreateFileMapping() altogether, at 
least on large files.  In fact my colleague has already re-written the code:  
We now create a shared memory region (backed by the paging file) that is the 
size of index we wish to read.  When we open the HD video file, we read this 
index into that region, and we're done.  This solution works great, with the 
only downside being a small delay caused by reading the entire index when the 
file is first opened.  But in practice this delay is negligible.
Thanks again for all your help, in particular pointing us to PoolMon to 
determine exactly what resources were being used.
Alex