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

Однако вы должны позаботиться о том, чтобы перечислить содержимое только один раз.

Другие вопросы по тегам