Imam "nqkakuv" problem

37 отговора 947 прегледа
#1

Imam "nqkakuv" problem

Znachi polzvam memory mapping, za da uskorq rabotata s edin fail. No ima nqkakuv tech (v 1 red kod !?), koito ne moga da si obqsnq. Moje bi problema e drugade, ne znam, no se nadqvam nqkoi da pomogne.

var
PData: PChar;

procedure Load(AFileName: string);
begin
CreateMapping(AFileName, PData); //CreateMapping mi dava pointer kum mapping-a
end;

procedure Unload;
begin
UnmapViewOfFile(PData); //neshto takova beshe za osvobojdavane na mapping-a
end;

function ReadData(const APos, ALenght: Integer): string;
begin
SetLength(Result, ALength);
Move((PData + APos)^, Result[1 ], ALength); //ei tuka ima iztichane
end;

Pri 40 000 posledovatelni prochitaniq ostavat nqkude 6MB v pametta. Vsushtnost az obhojdam celiq fail (toi e kum 6MB) i moje bi pri chetene vinagi ostava prochetenoto v pametta zadelena za moq proces, ne sum siguren tochno.

Toq Move si e Delphi-iiska funkciq i otnachaloto, kato ne q znaeh, si bqh napisal tochno sushtiq kod, taka che mi se struva, che e nared

Any1 !?

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #2

Re: Imam "nqkakuv" problem

Ne znam kak e na Delphi, no na C++ trjabwa da naprawish pyrwo
CreateFileMapping i MapViewOfFile,
a kato swyrshish,
UnmapViewOfFile i CloseHandle na mapping-a.

Struwa mi se che ne iztriwash samia mapping.

Отговор
в отговор на Waz Gaa #3

Re: Imam "nqkakuv" problem

Na purvo miasto sto ne go zarejesh tva Delphi, tozi kod edin bog zane kvo pravi, a inache tva e koeto ti trebe:

1. CreateFileMapping
2. MapViewOfFile
3. UnmapViewOfFile

Отговор
в отговор на Gonzu #4

Re: Imam "nqkakuv" problem

Toq CloseHandle spored teb nujen li e? Az mai sum gledal ot help-ovete, a i bi trqbvalo UnmapView da e dostatuchno

by Waz Gaa
[email protected]
Отговор
в отговор на pm #5

Re: Imam "nqkakuv" problem

Problema ne e v Delphi, vie izobshto zanimavali li ste se s nego :-(

Az vsi4ko za suzdavane na mapping-a sum go napravil. I Delphi polzva WinAPI, taka che nqma razlika v funkciite, koito se polzvat i nachina im na upotreba.

Problema ne e v tova, che nakraq ne mi se osvobojdava pametta.

Problema e, che kato bachkam s informaciqta, kato cheta, postoqnno mi se zadelq nova pamet

Sq neznam dali Windows ne se pravi na umen i sq cache-ira i da gleda da q osvobodi, chak ako ne e ostana nikakva. Tova pitam. Nqkoi bachkal li e s MemMap, daite nqkakuv kod za chetene na chast ot mem mapped file (kakuvto i da e ezik, no da e WinAPI ;)

by Waz Gaa
[email protected]
Отговор
в отговор на pm #6

Re: Imam "nqkakuv" problem

basi... ne sme li bulgarite jaki, a?

postojanno dawame akul shto e hubavo i shto e losho!!

dali zaradi tva sme na tova polozhenie, a?

shtot dawame akul i na polititzi, i na avtomobilni montjori, i na prodavachkite w magazina, puk i na birariite kak da sa prai birata po-dobra... areeee marsh!

tirulirutatuutuu
Отговор
в отговор на Waz Gaa #7

Re: Imam "nqkakuv" problem

Mi ne sum se zanimaval s delfi ama kat go gleam koda i mi izglejda stranno, nekak si ne e explicitno tfa deto trebe da stane.
Eto ti C++ kod, tfa e ot edna knijka na Richter, stoto me murzi da pisha, ne sum go probval, no taka kato go gledam trebe da bachka, izpolzva se edna malko advanced koncepcia PAGE_WRITECOPY ama ako imash MSDN she se opraish:

// Open the file that we want to map.
HANDLE hFile = CreateFile(pszFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

// Create a file-mapping object for the file.
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY,
0, 0, NULL);

// Map a copy-on-write view of the file; the system will commit
// enough physical storage from the paging file to accommodate
// the entire file. All pages in the view will initially have
// PAGE_WRITECOPY access.
PBYTE pbFile = (PBYTE) MapViewOfFile(hFileMapping, FILE_MAP_COPY,
0, 0, 0);

// Read a byte from the mapped view.
BYTE bSomeByte = pbFile[0];
// When reading, the system does not touch the committed pages in
// the paging file. The page keeps its PAGE_WRITECOPY attribute.

// Write a byte to the mapped view.
pbFile[0] = 0;
// When writing for the first time, the system grabs a committed
// page from the paging file, copies the original contents of the
// page at the accessed memory address, and maps the new page
// (the copy) into the process's address space. The new page has
// an attribute of PAGE_READWRITE.

// Write another byte to the mapped view.
pbFile[1] = 0;
// Because this byte is now in a PAGE_READWRITE page, the system
// simply writes the byte to the page (backed by the paging file).

// When finished using the file's mapped view, unmap it.
// UnmapViewOfFile is discussed in the next section.
UnmapViewOfFile(pbFile);
// The system decommits the physical storage from the paging file.
// Any writes to the pages are lost.

// Clean up after ourselves.
CloseHandle(hFileMapping);
CloseHandle(hFile);

Отговор
в отговор на malkia #8

Re: Imam "nqkakuv" problem

Ndaaa, maluk, tuj e. Bg sme noo cool.

Отговор
в отговор на Waz Gaa #9

Re: Imam "nqkakuv" problem

Mi ako si naprawish truda da poglednesh help-a shte widish che String weche e malko C-style string i che wsyshtnost direktnoto indexirane ne e tochno taka kakto si mislish (w twoia sluchai sochi kym 2-a char i bastiswash terminirashtata 0-la).

Ako iskash da polzwash star stil stringowe polzwai ShortString.

Отговор
в отговор на gruhal #10

Re: Imam "nqkakuv" problem

hm, wsyshtnost az sym w greshka, toi si e 0 terminiran weche, obache delphi pak si go indexira ot 1 - sorry.

btw. (MSDN)

To fully close a file mapping object, an application must unmap all mapped views of the file mapping object by calling UnmapViewOfFile, and close the file mapping object handle by calling CloseHandle.

Moje da probwash syshto s BoundsChecker.

Отговор
в отговор на Waz Gaa #11

Re: Imam "nqkakuv" problem

Delphi ima sobstwen memory manager koeto prawi (pochti) newazmojno izpolzwaneto na direktinite api funkcii. Sashtiq toq memory manager moje i da e krif za towa che uj ti se qde pamet - narastwaneto moje da idwa ot klasterirane na zaetite blokowe. Az lichno ne polzwam file maping a direktno si loadwam cqliq fajl w pametta kato ostaqm na qdroto da se opraq s swaping - taka se poluchawa maksimalno izstiskwane na nalichnata fizicheska pamet i prostoto pri programirane. Mnozina sa na drugo mnenie ma nali sme swobodna darjawa seki moje da si programira kakto iska

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на SDR #12

Re: Imam "nqkakuv" problem

Da loadvash celia fail ako e goliam e overkill.

Отговор
в отговор на pm #13

Re: Imam "nqkakuv" problem

do nqkolko desetki megabaijta ne e problem :) stawa barzo i lesno. Za fajlowe po-golemi ot swap fajla weche ima problem, ma dosega ne mi se e nalagalo seriozno da rabotq s chak tolkowa golemi fajlowe. Inach za chii k.r mi e twa edresno prostranstwo ako nqma da go polzwam :)

------------------------------
I got a COMPILER, and I'm not afraid to use it!
Отговор
в отговор на Waz Gaa #14

10x

OK 10x
Nachi puskam dopulnitelno edin CLoseHandle (da ne bi da e ostanalo neshto)

A puk za realniq problem shte potursq pak kakvo moje da e. Qvno shte pomaga nqkoi tool. Ako ne se opravq pak shte se obadq, toq put s egzampul. Nadqm se nqma da ima problemi

Vse pak da popitam nqkoi za komentar. Nachi pravq edin app deto zarejda ot 6MB fail chast ot teksta i go pokava v Memo. Vurtq array-a nagore nadolu po faila i ne se zadelq nikakva pamet.
Sled tova pravq sushtoto s memmap i Move (tova deto go pokazah, no absloiutno otdeleno ot realnata programa). Zapochvat da se zadelqt ~4KB na 2-3 pokazvaniq. E tova kakvo e !? Emii pak shte go razgledam Sigurno e neshto tupo

by Waz Gaa
[email protected]
Отговор
в отговор на Waz Gaa #15

Re: 10x

Скапано Делфи, това е.

Отговор
в отговор на -- #16

Re: 10x

Hehe... mi de da znam...

PS Zasegna me dulboko, ne moga da ne se obadq

by Waz Gaa
[email protected]
Отговор
в отговор на malkia #17

Re: Imam "nqkakuv" problem

jak si malkia, super si jak...

no ne zashtoto si bulgarin, a zashoto si papkal povechko...

Отговор
в отговор на edno momiche #18

Re: Imam "nqkakuv" problem

cunt

tirulirutatuutuu
Отговор
в отговор на malkia #19

Re: Imam "nqkakuv" problem

tlusta protivna bradata svinia

Отговор
в отговор на gruhal #20

Re: Imam "nqkakuv" problem

gruhal ne dogruhal..

Отговор