152 MB boyutunda bir metin dosyasında yaklaşık 7 milyon öğe içeren dizelerim var. Tek bir dize alan ve bu dizeler listesinde olup olmadığını döndüren bir işlevi uygulamak için en iyi yolun ne olabileceğini merak ediyordum.Büyük bir metin dosyasına bir dize mi uyuyorsunuz?
cevap
Bu metin dosyasına karşı birkaç kez eşleşmek zorunda mısın? Eğer öyleyse, bir HashSet<string>
oluştururdum. Aksi takdirde, sadece satır satır satır oku (satır başına bir dize varsayarak) ve eşleşip eşleşmediğini görüyorum.
ASCII'nin 152MB'lık belleği bellekte 300MB'lık Unicode verisi olarak bitecektir - ancak modern makinelerde çok sayıda bellek vardır, bu nedenle tüm lotu HashSet<string>
numaralı telefona sabit tutmak, tekrarlanan aramaları çok hızlı bir şekilde gerçekleştirecektir.
bunu yapmak için mutlak basit yolu o zaman atılacak bir dizi yaratacak rağmen, File.ReadAllLines
kullanmak muhtemelen - bellek kullanımı için büyük değil, ama muhtemelen çok kötü değil:
HashSet<string> strings = new HashSet<string>(File.ReadAllLines("data.txt"));
...
if (strings.Contains(stringToCheck))
{
...
}
Ne yapmak istediğine bağlı. Eşleşmeleri tekrar tekrar aramak istediğinizde, tüm dosyayı belleğe (HashSet
) yüklerdim. Orada eşleşmeleri bulmak çok kolay.
- 1. cmd - bir metin dosyasına
- 2. göster bir metin dosyasına
- 3. Anlık pencerenin içeriğini bir metin dosyasına yazın
- 4. boto3 glacier dosyasına bir dize yükleme
- 5. bir metin böyle N satırla sınırlı bir metin dosyasına satırlar için dairesel tampon uygulayan bir piton komut dosyasına gerek piton
- 6. C# Belirli bir satır numarasında metin dosyasına bir satır yazmak
- 7. Liste kutusunun öğelerini bir metin dosyasına kaydetme
- 8. Android'de bir metin dosyasına nasıl eklenir?
- 9. C++ yapılarının bir metin dosyasına dökülmesi
- 10. Tarayıcıyı bir metin dosyasına okumak için kullanma
- 11. Linux: DD sonuçlarının bir metin dosyasına gönderilmesi
- 12. PrintWriter metin dosyasına yazmıyor
- 13. LinqPad bir mdf dosyasına bağlanabilir mi?
- 14. Metin dosyasındaki satırları ikinci bir metin dosyasına göre sıralamak nasıl
- 15. Octave'de bir metin dosyasına matris yazmanın en hızlı yolu nedir?
- 16. Büyük bir dosyayı dize satırlarına okuma OCaml
- 17. Yerel metin dosyasına
- 18. PowerShell: metin dosyasına yazma
- 19. Bir dize olarak verilen bir büyük sayıyı bir OpenSSL BIGNUM
- 20. Python'da büyük bir metin dosyası nasıl okunur?
- 21. Bir XSLT bir metin dizesini ayrıştırabilir mi?
- 22. Bir char'in hex değerlerini ASCII'de bir metin dosyasına nasıl yazarsınız?
- 23. Bir altprogram çağrısını bir metin dosyasına nasıl dağıtırım?
- 24. Java'da varolan bir metin dosyasına yeni bir satır nasıl eklenir?
- 25. Matlab'da bir tamsayı matrisini bir metin dosyasına nasıl kaydederim?
- 26. PHP Array Metin dosyasına kaydedildi
- 27. C# büyük metin dosyasını arıyor
- 28. putStrLn'den çıktıyı Haskell'de metin dosyasına kaydedin
- 29. Bir metin görünümünde dize ve char değiştirme
- 30. Bir dize var varchar (max) 'dan daha büyük nasıl saklanır?
Aslında tekrar tekrar aramak zorundayım. Ama bunu bir web uygulamasında kullanacağım. Bellek birçok istekle bir sorun olur mu? –
@Taz: Hashmap'ı yalnızca bir kez oluşturduğunuz sürece istek sayısı ilgisizdir :) Dokümantasyona göre: * Bu türden herhangi bir genel statik üye iş parçacığı için güvenlidir *, bu yüzden sorun yok – tanascius
@Taz : tanascius haklı. Bir kez yükleyin ve fazladan bellek kullanımı olmadan arama yapabilmelisiniz (birden fazla eşzamanlı iş parçacığı kullanarak, hatta - hiçbir şey yazılmadığı sürece). Web sunucunuz seti tutmak için yeterli belleğe sahip olduğu sürece, işte bu yol. –