Geniş bir dosyam var, 100.000 satır. Her satırı okuyabiliyorum ve işleyebilirim veya çizgileri bir dizide saklayabilirim ve sonra işleyebilirim. Ekstra özellikler için diziyi kullanmayı tercih ederim, ancak bir dizide çok sayıda satırın saklanmasıyla ilişkili bellek kullanımı ve buna değecek bir şey varsa gerçekten endişeliyim.Büyük bir dosya satırını satır halinde okuma veya satırlarını dizide saklama
6
A
cevap
3
sen tanımak gereken iki işlevi vardır.
ilk
bir dizi elemanı olarak her bir hat ile, bir diziye bütün bir dosyasını okurfile()
vardır. Bu kısa dosyalar için iyidir ve muhtemelen 100k satırlık bir dosyada kullanmak istediğiniz şey değildir. Bu işlev kendi dosya yönetimini ele alır, bu nedenle dosyayı kendiniz açmanız ve kapatmanız gerekmez.
ikinci bir seferde bir dosya bir satır okumak için kullanabileceğiniz fgets()
vardır. Bunu işlemek için daha fazla çizgi olduğu sürece döngü yapmak ve döngü içinde satır işlemlerinizi yürütmek için kullanabilirsiniz. Bu dosyada bir tanıtıcı elde etmek için fopen()
kullanmanız gerekecek, dosya yönetimini kurtarma yönetimi için kendiniz izlemek isteyebilirsiniz (yani, bir şeyler yana doğru giderse ve komut başarısız olursa sıfırdan işlemeyi yeniden başlatmanız gerekmeyecek),
vb
Umarım bu başlangıç için yeterli.
1
Nasıl ikisinin bir kombinasyonu hakkında? Bir diziye 1000 satırı okuyun, işleyin, diziyi silin, daha sonra 1000 tane daha okuyun, vb. Bellek kullanımını izleyin ve bir seferde bir diziye kaç tane okuduğunuzu ayarlayın.
İlgili konular
- 1. C++ Dosya satırını satır satır okuma ve sınırlayıcıyı kullanarak her satırı bölme
- 2. Java: Dosya satırını, "\ n"
- 3. Bir gzip dosya satırını nasıl okuyabilirim?
- 4. Bir diziye ikili dosya okuma
- 5. Büyük bir dosyayı dize satırlarına okuma OCaml
- 6. Bir dosya buluncaya kadar dosya satırlarını atlayın, geri kalanını kopyalayın
- 7. mongoDB'deki büyük dizide nasıl toplanır?
- 8. bir HALİNDE
- 9. ölümcül: Dosya açılamadı. Okuma/yeniden düzenleme-birleştirme/okuma için bitti: Böyle bir dosya veya dizin yok
- 10. NumPy dizisinin bir satırını toplayın
- 11. Makefile içinde bir dosya okuma
- 12. Sayısal dizide en yüksek değeri içeren satır veya sütunu bulma
- 13. Yüklenen dosya verilerini RavenDB ile saklama
- 14. phantomjs javascript yerel bir dosya hattını satır satır oku
- 15. Bash: Sekme ile ayrılmış dosya satırını
- 16. Dosya satırını oku ve bir listede sakla
- 17. Kaynak klasörden bir dosya okuma
- 18. Dosya Okuma/Yazma
- 19. Geçerli kaynak dosya satırını D
- 20. Veri jasper raporları taşması halinde satır genişletme
- 21. C çizgisinde bir kerede bir satır okuma
- 22. 2B dizi halinde seçin
- 23. Bir satır ayrılmış dosya
- 24. Python: döngü içindeki tüm metin dosyalarının satırlarını oku
- 25. Numune dizilerini dosya olarak saklama ve yükleme
- 26. HTTR GET büyük bir dosya
- 27. Nasıl nltk.FreqDur geçmek için büyük bir bölünmüş liste veya dosya
- 28. Dizide bir dizide transpoze dizisi
- 29. URLConnection'dan ikili dosya okuma
- 30. Uzun bir Stata dosya kodunun yalnızca belirli satırlarını çalıştırmak nasıl? (ör. satır 30-3200)
Eğer sadece bir kez yapmanız gerekiyor mu, yoksa çok sayıda eşzamanlı web kullanıcılarının bu eylemi tetikleyen edilecek? Ve eğer çok ise, neden dosyanın içeriğini bir veritabanına saklamıyorsunuz? –
Metin satırlarına (bir yineleyici) dizi benzeri erişim elde etmek için 'SplFileObject' kullanabilirsiniz. – mario
Muhtemelen probleminize daha iyi bir yaklaşım bulamadınız. Nadiren, 100 000 satırının aynı anda * aynı anda * belleğe sahip olması gerekir. Bunu yapmanın başka yollarını düşünün, mevcut planınızla performans sorunlarınız olacak. – Incognito