Obur bellek RAM MT5, büyük dosyaları okuma / yazma ile ilgili sorunlar - sayfa 2

 
Vladislav Andruschenko :


Bir zamanlar böyle bir sorunla karşılaştım. Birçok düzeltme yaptı. Her şeyi hatırlamıyorum - tek seferlik bir görevdi,

ancak burada ArrayResize (arrRead_01,arrSize) ayarlamayı deneyin; 3. parametre


    int      rezerv_boyutu=0          // yedek boyut değeri (fazla)


Deney.

Teşekkürler, ancak deneylere bakılırsa tüm frenler ve bellek tüketimi, bir dosyadan bilgi okumak için sınıfa düşüyor. Belki düzeltilecek bir şey vardır?

 
İkinci soru hakkında yardım almayı çok isterim - yazma sınırı, biri bu sorunu çözdü mü?
 

Belleğin yeniden tahsisinin hızına bakılırsa, dizi dizileri nesneler dizileri olarak depolanır, onlara işaretçiler değil, dolayısıyla frenler. Geliştiricilerin bu konuyu netleştirmesi gerekiyor, karar buna bağlı.

Ardından, ayrıştırıcı dizeden yerel bir hücre dizisi oluşturur ve bunları ayrılan belleğe kopyalar - fazladan bir koltuk değneği ve bunda önemli bir tane.

Nesne dizileri olarak ise, görevdeki hücre güncellemelerinin sıklığına ve sayısına bağlı olarak, yükleme sırasında dosyayı ayrıştırmamak, ancak csv dosyasını bir dizi dosya dizisi olarak depolamak ve güncellemek için zaman açısından daha ucuz olabilir. anında veri (yani hücreye her erişildiğinde dizeyi ayrıştırma). Her durumda, praser'in yeniden yazılması gerekir, son derece verimsizdir ve alıntılanan hücreleri desteklemez ve yalnızca sayısal tabloları içe aktarmak için uygundur.

 
SeriousRacoon :

Belleğin yeniden tahsisinin hızına bakılırsa, dizi dizileri nesneler dizileri olarak depolanır, onlara işaretçiler değil, dolayısıyla frenler. Geliştiricilerin bu konuyu netleştirmesi gerekiyor, karar buna bağlı.

Geliştiriciyi aramaya çalışalım, ayrılan belleğe kopyalar - fazladan bir koltuk değneği ve bunda önemli bir tane.

Ondan nasıl kurtulabilirsin?

Ciddi Rakun :

Nesne dizileri olarak ise, görevdeki hücre güncellemelerinin sıklığına ve sayısına bağlı olarak, yükleme sırasında dosyayı ayrıştırmamak, ancak csv dosyasını bir dizi dosya dizisi olarak depolamak ve güncellemek için zaman açısından daha ucuz olabilir. anında veri (yani hücreye her erişildiğinde dizeyi ayrıştırma). Her durumda, praser'in yeniden yazılması gerekir, son derece verimsizdir ve alıntılanan hücreleri desteklemez ve yalnızca sayısal tabloları içe aktarmak için uygundur.

"Dosya satırı dizisi" - ne demek istiyorsun? Tüm dizelerin yazılacağı bir dizi oluşturmaktan bahsediyorsa, anladığım kadarıyla dizenin uzunluğunun karakter sayısında bir sınırı var, değil mi?

Okuma dersi bir MQ çalışanı tarafından yazılmıştı, orada her şeyin iyi yazıldığını düşündüm.

Ayrıştırıcı metni doğru okuyor, burada size katılmıyorum - daha önce eklenen komut dosyası bunu doğrular.

 
Aleksey Vyazmikin :

Geliştiriciyi aramaya çalışalım, @Renat Fatkhullin - durumu açıklayabilir misiniz?

Ondan nasıl kurtulabilirsin?

"Dosya satırı dizisi" - ne demek istiyorsun? Tüm dizelerin yazılacağı bir dizi oluşturmaktan bahsediyorsa, anladığım kadarıyla dizenin uzunluğunun karakter sayısında bir sınırı var, değil mi?

Okuma dersi bir MQ çalışanı tarafından yazılmıştı, orada her şeyin iyi yazıldığını düşündüm.

Ayrıştırıcı metni doğru okuyor, burada size katılmıyorum - daha önce eklenen komut dosyası bunu doğrular.

İçinde sınırlayıcı karakter bulunan tırnak içine alınmış dizelerin olmadığı dosyaları doğru şekilde okur. Onları 60;""sample;string"" okumayı deneyin. Çıktı 2 hücre olmalıdır: [60] ve [örnek;dize]. Ve görünüşe göre 3 - [60] [""örnek] [dize""] olacak. (ZY ayrıca, ksv'de alıntılanan dizelerin tirelenmesine izin verilir :))

Bundan C'de veya artılarda nasıl kurtulacağımı biliyorum - önce dizelere bir dizi işaretçi tahsis eder ve bir dizeyi ayrıştırarak doldururdum. µl'de işaretçi yok, bu soruna nasıl yaklaşacağımı anlayamıyorum. Umarım Renat açıklayabilir.

"Dosya satırı dizisi" - ne demek istiyorsun? Tüm dizelerin yazılacağı bir dizi oluşturmaktan bahsediyorsa, anladığım kadarıyla dizenin uzunluğunun karakter sayısında bir sınırı var, değil mi?

Yani, dosyayı satır satır okuyun ve dosyanın her kaynak satırını ayrıştırmadan bir dizide saklayın. Bir dizgeye (satır, sütun) biçiminde erişirken, dize satırını alın, anında ayrıştırın ve yol boyunca ayrıştırma sonucunu önbelleğe alarak değer sütununu verin.

 

İşte başka bir olası çözüm. Bir dosyayı okurken, bir ön analiz yapın - her satır için iki tamsayı değerinden oluşan bir dizi kaydedin: satırdaki hücre değerinin başladığı karakterin dizini ve bu alt dizinin uzunluğu.

Örneğin:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

İşte indekslerin ve uzunlukların değerleri ve talep üzerine daha fazla ayrıştırma için kaydedin.
 
SeriousRacoon :

İçinde sınırlayıcı karakter bulunan tırnak içine alınmış dizelerin olmadığı dosyaları doğru şekilde okur. Onları 60;""sample;string"" okumayı deneyin. Çıktı 2 hücre olmalıdır: [60] ve [örnek;dize]. Ve görünüşe göre 3 - [60] [""örnek] [dize""] olacak. (ZY ayrıca, ksv'de alıntılanan dizelerin tirelenmesine izin verilir :))

Ve açıkçası, CSV standardının bu tür inceliklerini bilmiyordum. Özellikleri açıkladığınız için teşekkürler!

Ciddi Rakun :

Bundan C'de veya artılarda nasıl kurtulacağımı biliyorum - önce dizelere bir dizi işaretçi tahsis eder ve bir dizeyi ayrıştırarak doldururdum. µl'de işaretçi yok, bu soruna nasıl yaklaşacağımı anlayamıyorum. Umarım Renat açıklayabilir.

Renat'ın açıklayabileceğini umalım.

Ciddi Rakun :

Yani, dosyayı satır satır okuyun ve dosyanın her kaynak satırını ayrıştırmadan bir dizide saklayın. Bir dizgeye (satır, sütun) biçiminde erişirken, dize satırını alın, anında ayrıştırın ve yol boyunca ayrıştırma sonucunu önbelleğe alarak değer sütununu verin.

Evet, zaman açısından optimal olacağını düşünüyorum, hatta önbelleğe bile özellikle ihtiyaç duyulmuyor sanırım. Bu yaklaşımı uygulamak için sınıfta yardımcı olabilir ve uygun değişiklikleri yapabilir misiniz?

 
SeriousRacoon :

İşte başka bir olası çözüm. Bir dosyayı okurken, bir ön analiz yapın - her satır için iki tamsayı değerinden oluşan bir dizi kaydedin: satırdaki hücre değerinin başladığı karakterin dizini ve bu alt dizinin uzunluğu.

Örneğin:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

İşte indekslerin ve uzunlukların değerleri ve talep üzerine daha fazla ayrıştırma için kaydedin.

Evet, bugün yukarıda bu yaklaşım hakkında yazdım - ne için en baştan hesaplamak ve ardından diziyi doldurmak için . Ama nasıl yapılabileceğini anlamıyorum :(

 

WriteArray / Read hızlıdır, maks. boyut 300 mb'ye ulaştı, her şey çok hızlı oluyor, RAM yemiyor

Neden okuma/yazma için bu kadar çok kod var, her şey 4 satırda yapılıyor

 
Maxim Dmitrievsky :

WriteArray / Read hızlıdır, maks. boyut 300 mb'ye ulaştı, her şey çok hızlı oluyor, RAM yemiyor

Neden okuma/yazma için bu kadar çok kod var, her şey 4 satırda yapılıyor

ayy