Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
iki stream'i birleştirmek
#1
iki stream var.
stream1 küçük boyutlu.
stream2 büyük boyutlu.

stream2'nin başına stream1 nasıl insert edilir ve sonuçta stream2 = stream1+stream2 olur.

dikkat : stream1'in sonuna stream2'yi eklemek istemiyorum. stream2'nin başına stream1 eklemek istiyorum.
ne farkı var derseniz birleşme esnasında geçici de olsa hafızayı verimli kullanmam gerek.

aşağıdakini yaparsak istediğim olmuyor.

............
stream1.copyfrom(stream2, stream2.size);  // burada stream1 sonuna stream2 ekleniyor.
............

stream2 zaten çok büyük, eğer yukarıdaki kodu yazarsak, stream1 de en az stream2 kadar büyük olacak ve kısa bir süre de olsa hafızada stream2'nn 2 katı büyüklüğü kadar yer kullanılmış olacak. bundan kurtulmaya ve sadece stream2'nin başına stream1'i eklemek istiyorum böylece hafızada sadece stream1 2 defa yer işgal etmiş olacak ki stream1 de zaten küçük.
Cevapla
#2
Hiç böyle iki Stream birleştirme gibi deneyimim olmadı ama öncelikli bakmanız gereken anahtar kelimeler Stream için size ve position.

Stream byte array gibi düşünün. Array için bu işlemi nasıl yaparsınız. Stream 2 Array boyutuna Array 1 kadar ilave arttır. Sonra Array 2 içeriğini sondan başa doğru Stream 1 kadar sona doğru kaydır. Sonrasında Stream 2 nin başına Stream 1 içeriğini ekle.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#3
Şöyle olabilir:
  1. stream2.size'ı stream1.size kadar artır.
  2. stream2'yi stream1.size kadar ileri taşı.
  3. stream1'i stream2'nin başlangıcına taşı.
Move, Stream.Write vs.
There's no place like 127.0.0.1
WWW
Cevapla
#4
bu çözümü düşündüm, mantıklı gibi de görünüyor ama göründüğü gibi değil iş.
2 nolu maddede sıkıntı var. stream2 ileri taşıma işini geçici bir stream kullanmadan yapamıyoruz çünkü kendi kendinin üstüne yazmamız gerekiyor o da olmuyor tabi. geçici stream kullanınca da yine stream2'nin iki katı kadar hafızada geçici de olsa işgaliyet oluyor, esas amaç bunu aşmaktı zaten.
Cevapla
#5
tfilestream yaratıp, streamden buffer mantığı ile okuyup bind işlemini diske yazdırarak yapar isen, bahsettiğin memory limite dokunmaz, diskde birleştirme bitincede streamlerini free edip diskden yükler isen istediğine ulaşırsın, buffer ilede 8kb 16kb artık ne kadar belleğin boşda ise okadarlık bir alanda işlemini yapabilirsin.
Cevapla
#6
bu çözümde de yine aslında geçici bir alan kullanılıyor, bu alan hafıza değil de disk. böylece hafızada meşguliyet olmuyor. hafıza sorunu çözülüyor ama başka bir sorun doğuyor, o da performans. diske okuyup yazmak çok fazla performans kaybı yapacaktır.

bu işin neden bu kadar üstünde duruyorum, çünkü sunucuda çok fazla sayıda işlem aynı anda yapılacak. hafızayı mümkün olduğu kadar tutumlu kullanmalıyım ve tabi performans olabildiği kadar üst seviyede olmalı.

benim sorunun çözümü pointerlarda yatıyor gibi geliyor bana ama.
Cevapla
#7
(Dün, Saat: 11:09)bibilen Adlı Kullanıcıdan Alıntı: bu çözümde de yine aslında geçici bir alan kullanılıyor, bu alan hafıza değil de disk. böylece hafızada meşguliyet olmuyor. hafıza sorunu çözülüyor ama başka bir sorun doğuyor, o da performans. diske okuyup yazmak çok fazla performans kaybı yapacaktır.

bu işin neden bu kadar üstünde duruyorum, çünkü sunucuda çok fazla sayıda işlem aynı anda yapılacak. hafızayı mümkün olduğu kadar tutumlu kullanmalıyım ve tabi performans olabildiği kadar üst seviyede olmalı.

benim sorunun çözümü pointerlarda yatıyor gibi geliyor bana ama.

öyleyse, 2 binary datayı string e atın, 
atmadan önce uzunluklarını alın,
attığınız string içinde istediğiniz konumdaki datayı move ile string in başına çekin, string i de stream datadescription a ptr ile atayabilirsiniz sanırım stream ile okumak istiyorsanız.

var
 source, dest : string;
begin
 // Set up our starting string
 source := '123456789';
 dest   := '---------';

 // Copy a substring from source into the middle of dest
 move(source[5], dest[3], 4);

veya

source:=copy(source, 1000, 5000)+ copy(source, 1, 100); 

 // Show the source and destination strings
 ShowMessage('Source = '+source);
 ShowMessage('Dest   = '+dest);
end;
Cevapla
#8
dostum sağol uğraşmışsın ama sorun birleştirmek değil, birleştirmek kolay iş zaten.
sorumu tam anlamamışsın sanırım. sorumu okursan dikkatlice ya da boşver derin konu biraz, boş yere beyin yakmayım.
sanırım bu sorunun geçici bir hafıza kullanmadan çözümü yok.
Cevapla
#9
(Dün, Saat: 12:34)bibilen Adlı Kullanıcıdan Alıntı: dostum sağol uğraşmışsın ama sorun birleştirmek değil, birleştirmek kolay iş zaten.
sorumu tam anlamamışsın sanırım. sorumu okursan dikkatlice ya da boşver derin konu biraz, boş yere beyin yakmayım.
sanırım bu sorunun geçici bir hafıza kullanmadan çözümü yok.

sizi anlamak zor, öyleyse öncelikle limitleri bir çizin, deyinki sunucu ramı şu kadar, swap şu kadar, işlemci modeli şu, disk io rate şu, sunucuda normalde şu kadar process açıkdır, şu kadar kullanımları vardır, benim process limitimde şu kadar memory cpu dir,
ve benim çalışdığım binary dosyada yani yüklediğim şu kadar gb dır,

eğer bu kadar misal 20gb lık bir datayı memorystream a atmaya çalışıyosanız, zaten atmayın böyle bir programlama olmaz,
eğer diyorsanızki benim kast ettiğim data 500mb, bu data nereden geliyor? diskdenmi, sql denmi? siz zaten bunu diskdenmi okuyorsunuz, yoksa bir fonksiyonla bu datayımı oluşturuyorsunuz sonra birleştirmek istiyorsunuz,

sizi anlamakda zorlanıyorum, siz bir sınırlı donanımda(örneğin 32mb epromu olan) mikroservismi yazıyorsunuz? 

siz bellekde o büyük binary dayayı cpu ya saydırdığınız an, bellek hızını kaybedersiniz, cpu mimarisinin io performasına takılırsınız.

nedir bu kadar önemli olan 1gigabytelık bir datayı 1sn için sunucu belleğinde bloklatsanız ne olur?

siz öncelikle gerçek bir senaryo çizmelisinizki okuyan ona göre yol göstersin, sizin kendi yorumlamınızla bunu yapamamışsınız,

olan biteni sunucu tarafında net olarak örnekleyinki yetkin olanlar daha iyi bir yol göstersin,

veya sunucuya 256gigabyte ram takın, olmadı ağdan bir kasaya 1tb tam takın ramdisk haline getirin uzakdan ona 10gigabit porttan erişip bu işlemleri onun belleğinde yapın,

veya o ağdaki ram diski locale fsdisk olarak bağlayın, oraya yazın.
Cevapla
#10
dostum boş ver o kadar lafa gerek yok. teşekkürler kafanı yorma.
sorum çok net. sağol, boş ver emek harcama.
bi çaresini bilen varsa yazar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  String'e çevrilmiş Stream Veri JsontoDataSet Dönüştürme Sorunu. pro_imaj 13 2.941 06-03-2020, Saat: 15:19
Son Yorum: Fesih ARSLAN
  [Çözüldü] HTTP üzerinden RTSP ile IP kamera stream işlemek Abdullah ILGAZ 3 2.936 06-03-2019, Saat: 00:47
Son Yorum: Yeliz
  Video stream yhackup 9 3.291 26-12-2017, Saat: 20:56
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi