LIMITE DATATABLE

ICHIHARA 09/09/2016 18:55:29
#466686
Boa Noite,

Tenho um processo que faz a leitura de um .txt e grava em um datatable que por sua vez em entregue a um bulkinsert.
Os arquivos tem aproximadamente 3milhoes de registros, porém sugiu um maior(5mi) e dando exception outofmemory no datable.add(row).
Existe algum limite no datatable? alguém sabe como contornar?

Obrigado!
KERPLUNK 09/09/2016 19:07:44
#466688
Até onde sei, o DataTable, assim como qualquer outro objeto de dados, é limitado pela memória da máquina. Por isso o está tendo esse erro. Cinco milhões de registro é realmente muita coisa e o approach deve ser diferente. Além disso, DataTable por si, é um objeto bastante pesado. Cada registro à mais, só contribui para que fique ainda mais.

Já pensou em usar um List<T>?
DS2T 09/09/2016 19:20:16
#466689
Se eu fosse você, eu leria registro a registro com um DataReader e iria gravando linha a linha no .txt com um StreamWriter...
Abraços!
KERPLUNK 09/09/2016 22:10:21
#466695
Citação:

:
Se eu fosse você, eu leria registro a registro com um DataReader e iria gravando linha a linha no .txt com um StreamWriter...
Abraços!


Acho que o processo dele é ao contrário, lê do txt para gravar no banco depois
JABA 10/09/2016 14:17:14
#466708
msdn.microsoft.com/en-us/library/system.data.datatable.aspx

Citação:

To add rows to a DataTable, you must first use the NewRow method to return a new DataRow object. The NewRow method returns a row with the schema of the DataTable, as it is defined by the table[ô]s DataColumnCollection. The maximum number of rows that a DataTable can store is 16,777,216. For more information, see Adding Data to a DataTable.



De acordo com o que está na documentação, o limite é de 16,777,216 rows.
KERPLUNK 10/09/2016 21:17:03
#466711
Citação:

:
msdn.microsoft.com/en-us/library/system.data.datatable.aspx

To add rows to a DataTable, you must first use the NewRow method to return a new DataRow object. The NewRow method returns a row with the schema of the DataTable, as it is defined by the table[ô]s DataColumnCollection. The maximum number of rows that a DataTable can store is 16,777,216. For more information, see Adding Data to a DataTable.

De acordo com o que está na documentação, o limite é de 16,777,216 rows.


Isso, se não acabar o espaço de memória antes.
JABA 11/09/2016 16:56:14
#466742
Quando o limite de memória comum exceder, o HD passa a substitui-lo.
ICHIHARA 12/09/2016 09:52:17
#466768
Bom dia Pessoal!!

Obrigado pelo retorno,
No caso, ainda temos problemas de memória?
A memória virtual não contornaria este problema?

Abs
ICHIHARA 12/09/2016 12:27:30
#466778
Boa Tarde Pessoal,

Consegui contornar gerando lotes de bulkinsert,
assim que o lote é gravado, limpo o datatable.clear() a memória é liberada e começo alimentar o datatable novamente.
tudo isso encapsulado em uma transação.
Atendeu minha necessidade.

Tópico encerrado , respostas não são mais permitidas