PROFI'den SUPERPROFI'ye kadar tüm sorularınız - 1. - sayfa 27

 
sergeev :

Bellek eşleme ile çalışma hakkında soru.

Kopyalama ve yeniden oluşturmaya başvurmadan, ayrılan belleğin (CreateFileMapping) ve projeksiyonunun (MapViewOfFile) boyutunu dinamik olarak değiştirmek mümkün müdür?

Yani sorun şu:

İşlemler (yazar-okuyucu) 100 bayt arasında veri alışverişi için bellekte bir CreateFileMapping nesnesi oluşturulur. ve 100 baytta aynı boyutta bir MapViewOfFile.

İlk yazma işlemi, ikinci okuma işleminin dışarı atmaya vakti olmayacağı 100 baytlık verinin tamamını belleğe yazabilir.

Bu nedenle, görev, ayrılan bellek miktarını CreateFileMapping / MapViewOfFile yeniden oluşturmadan genişletmenin mümkün olup olmadığıdır.
Böylece ilk süreç yayınlanmayı beklemez, eklenen birime yazmaya devam ederken, ikincisi de okumaya devam eder.

Yapabilir. Daha fazlasını vurgulamak daha iyidir. Daha hızlı çalışacaktır. Aynı kütüphanede uyguladım.
 
Zhunko :
Yapabilir. Daha fazlasını vurgulamak daha iyidir.

Hmm, biraz yanlış.

Eşlemenin hiçbir boyutu yoktur, oluştururken yalnızca maksimum boyut belirtilir, genellikle (ve varsayılan olarak) birlikte çalıştığımız dosyanın boyutuna eşittir.

Bir görünüm için, boyut oluşturma sırasında ayarlanır ve UnmapViewOfFile işlevi olmadan yalnızca erişim bayraklarında şamanizm olması durumunda değiştirmek mümkündür veya belki de hiç değiştirilemez.

Ve neden boyutu hiç değiştirelim?

 
Zhunko :
Yapabilir.
gibi ? MSDN ve Google'a göndermeyin, zaten yarım gündür oradayım.

TheXpert :

Hmm, biraz yanlış.

Eşlemenin hiçbir boyutu yoktur, oluştururken yalnızca maksimum boyut belirtilir, genellikle (ve varsayılan olarak) birlikte çalıştığımız dosyanın boyutuna eşittir.

mesele bu. Peki, oluştururken boyut = 100 bayt belirtildiğini yazdım.
ikincisi, fiziksel bir dosyayla değil, sadece bellekle çalışıyorum. bir süreç bilgiyi başka bir sürece iletir.

Ve neden boyutu hiç değiştirelim?

işlem sırasında , ayrılan bellek 100 baytın tamamı tarafından doldurulur. Ancak veriler yeni görünüyor ve bu nedenle bunları eklemek gerekiyor. Bu yüzden onları eklemek için bu hacmi genişletmek gerekiyor.

Bu yüzden soruyorum - ayrılan 100 baytı ara kopyalamaya ve yeniden oluşturmaya başvurmadan nasıl genişletebilirim.

Bir bükülme ile anladım. sadece yeniden yapman gerekiyor. CreateFileMapping nesnesinin kendisi ne olacak? onunla genişletmek için kapatmadan çıkacak mı?

 
Yol boyunca, eşleme yoluyla okumak için eşlemenin boyutu Oluştur'da sabit bir değere ayarlanır.
.
Muhtemelen sadece yeniden yaratmak mümkün.
.
AMA: çok büyük bir seyrek dosya oluşturursanız (örneğin, 2 gigabayt),
o zaman her şey yoluna girecek. Ama dosyanın sonu sistem dosya boyutunun dışında anlaşılmalıdır.
.
Ancak o zaman bir dosyadan okuma işleminin nasıl senkronize edileceğini sormak zaten gerekli olacaktır.
onlar. verinin hangi kısmının yazıldığı ve nerede olduğu nasıl öğrenilir.
 

Genel olarak, böyle bir hacim gerekli değildir.

süreçler sadece eşzamansız olarak yazar/okur. ve yazarın, okuyucu yazılan her şeyi tırmıklayana kadar beklemekten rahatsızlık duymaması için bir yol gereklidir.

yani, içeriği değiştirmeden diziyi genişletmek için ArrayResize gibi bir şeye sahip olmanız gerekir. Okuyucu tüm verileri alır almaz, hafıza yeniden baştan yazmaya hazır hale gelir.

 
jartmailru :

Ancak o zaman bir dosyadan okuma işleminin nasıl senkronize edileceğini sormak zaten gerekli olacaktır.
onlar. verinin hangi kısmının yazıldığı ve nerede olduğu nasıl öğrenilir.

Bu sorunu hemen çözdüm.

ancak boyutta dinamik artışla, henüz değil :(

Vadim (Zhunko) çok cömertse, umarım size hangi işlevleri kullanacağınızı söyler...
 
Tekrar ediyorum: Seyrek dosyalar diye bir şey var...
Bu, 2 giga'lık bir dosyanın diskte 0 bayt kapladığı anlamına gelir.

hm. Ve dosyayı iletilen dosyanın maksimum boyutuna ayarlayın.
veri mümkün değil mi?
 
jartmailru :
Tekrar ediyorum: Seyrek dosyalar diye bir şey var...
Bu, 2 giga'lık bir dosyanın diskte 0 bayt kapladığı anlamına gelir.

Dosya kullanmıyorum, her şey hafızadan yapılıyor. Yukarıda üç kez yazdım zaten.

// eğer kolaylaştırıyorsa

CreateFileMapping( INVALID_HANDLE_VALUE , NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\\page");

Bu FILE_SIZE beni rahat bırakmıyor. onu özellikle kendine bağlar.

hm. Ve dosyayı aktarılan verilerin maksimum boyutu için ayarlayamıyor musunuz?
veri miktarı önceden bilinmemektedir.
Seyrek hakkında okudum, faydalı olabilir. eğer dinamik olarak genişleyebilirlerse.
 
sergeev :

mesele bu. Peki, oluştururken boyut = 100 bayt belirtildiğini yazdım.

ikincisi, fiziksel bir dosyayla değil, sadece bellekle çalışıyorum. bir süreç bilgiyi başka bir sürece iletir.

Kimin umrunda? Özü aynı, sadece infa diske değil belleğe yazılır. Yine de iş, CreateFile aracılığıyla açılan bir tanıtıcı ile gerçekleşir.

Burada (bellekte bir dosya oluştururken), ötesinde kesinlikle hiçbir bilgi olmayacak olası maksimum boyutu belirtmelisiniz.

işlem sırasında, ayrılan bellek 100 baytın tamamı tarafından doldurulur.

Sorun ne? 100 baytlık bir ofset ile başka bir görünüm yaptım, ancak eşlemenin (yani dosyanın) boyutunda bu önceden dikkate alınmalıdır.

Bir bükülme ile anladım. sadece yeniden yapman gerekiyor. CreateFileMapping nesnesinin kendisi ne olacak? onunla genişletmek için kapatmadan çıkacak mı?

Genişletme yanlış, boyutunda bu zaten dikkate alınmalıdır.
 
TheXpert :
Genişletme yanlış, boyutunda bu zaten dikkate alınmalıdır.
Tek seçenek bu gibi görünüyor.