Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Maximale Buffergröße bei TransactNamedPipe? (https://www.delphipraxis.net/81159-maximale-buffergroesse-bei-transactnamedpipe.html)

alzaimar 21. Nov 2006 18:12


Maximale Buffergröße bei TransactNamedPipe?
 
Hallo!

Ich arbeite gerade mit Pipes und stehe nun vor dem Problem, das die Routine 'TransactNamedPipe' mit einer Buffergröße von 40.000.000 aufgerufen wird. Ich gebs ja zu, vielleicht ein wenig groß.

Nun meckert die Routine und gibt ein 'Invalid Argument' zurück. Der gleiche Aufruf mit einer Puffergröße von 1000 funktioniert.

Gibt es eine maximale Größe für Puffer oder Adressbereiche, die man an eine Windows-Routine übergeben kann? Es scheint fast so, aber ich habe darüber Nichts finden können.

Weiss jemand mehr darüber?

Ach ja: Natürlich kann ich die 40 MByte fragmentieren, aber hier gehts es mir ausnahmesweise ums Prinzip.

marabu 21. Nov 2006 21:09

Re: Maximale Buffergröße bei TransactNamedPipe?
 
Hallo alzaimar,

da der Speicher für deine named pipes aus dem nonpaged memory pool rekrutiert wird, solltest du vorsichtig mit zu großen Werten sein:

Microsoft : PSDK 2003 : CreateNamedPipe() : Remarks
... Every time a named pipe is created, the system creates the inbound and/or outbound buffers using nonpaged pool, which is the physical memory used by the kernel.

... The input and output buffer sizes are advisory. The actual buffer size reserved for each end of the named pipe is either the system default, the system minimum or maximum, or the specified size rounded up to the next allocation boundary. The buffer size specified should be small enough that your process will not run out of nonpaged pool, but large enough to accommodate typical requests.

Der system default sollte 64KB sein, wenn ich mich recht erinnere. Die Unter- und Obergrenzen sind mir leider nicht bekannt. Unter OS/2 sollte man die buffer size unbedingt als Vielfaches von 1024 Byte wählen, damit das System nicht ausgebremst wird. Die Systemwerte sollten sich aber mit wenig Aufwand mittels GetNamedPipeInfo() ermitteln lassen.

Gute Nacht

alzaimar 21. Nov 2006 21:31

Re: Maximale Buffergröße bei TransactNamedPipe?
 
Hallo marabu,

ich habe die entsprechende Passage in der SDK gelesen, aber -vermutlich wegen beginnender Senilität- keinerlei Begrenzungen ablesen können.

Danke für die Anwort.

Meine Resultate werde ich dann hier posten.

alzaimar 22. Nov 2006 16:58

Re: Maximale Buffergröße bei TransactNamedPipe?
 
Ein kurzer Versuch hat gezeigt, das die maximale Puffergröße 32k beträgt. Mit Overlapped IO kommt man dann auf Transferraten von 60MB/sec, was eigentlich ausreicht.

Heffalump 23. Nov 2006 11:27

Re: Maximale Buffergröße bei TransactNamedPipe?
 
In der msdn unter WriteFile gefunden
Zitat:

nNumberOfBytesToWrite
[in] Number of bytes to be written to the file.
A value of zero specifies a null write operation. The behavior of a null write operation depends on the underlying file system. To truncate or extend a file, use the SetEndOfFile function.

Named pipe write operations across a network are limited to 65,535 bytes.

alzaimar 23. Nov 2006 13:18

Re: Maximale Buffergröße bei TransactNamedPipe?
 
Hi Heffalump, ich sollte vielleicht doch LESEN, was ich mir in der OH raussuche :oops: . Dessenungeachtet bekomme ich eh nur max 32k hin.

Danke für den Tipp!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz