CsvProvider выбрасывает исключение OutOfMemoryException
FAOCropsLivestock.csv
содержит более 14 миллионов строк. В моем .fs
файл, который я объявил
type FAO = CsvProvider<"c:\FAOCropsLivestock.csv">
и пытался работать с следующим кодом
FAO.GetSample().Rows.Where(fun x -> x.Country = country) |> ....
FAO.GetSample().Filter(fun x -> x.Country = country) |> ....
В обоих случаях, exception
был брошен.
Я также попытался с следующим кодом после загрузки csv
файл на сервере MSSQL
type Schema = SqlDataConnection<conStr>
let db = Schema.GetDataContext()
db.FAOCropsLivestock.Where(fun x-> x.Country = country) |> ....
оно работает. Это также работает, если я выпускаю query
с помощью OleDb
соединение, но оно медленное.
Как я могу получить последовательность из этого, используя CsvProvider
?
1 ответ
Если вы обратитесь к нижней части документации провайдера типов CSV, вы увидите раздел, посвященный обработке больших наборов данных. Как объяснено там, вы можете установить CacheRows = false
что поможет вам, когда дело доходит до обработки больших наборов данных.
type FAO = CsvProvider<"c:\FAOCropsLivestock.csv", CacheRows = false>
Затем вы можете использовать стандартные последовательности операций над строками CSV в виде последовательности, не загружая весь файл в память. например
FAO.GetSample().Rows |> Seq.filter (fun x -> x.Country = country) |> ....
Однако вы должны позаботиться о том, чтобы перечислить содержимое только один раз.