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.
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. –