Mam plik XML, który wynika z eksportu tabeli bazy danych (Oracle 11g Unicode). Ta tabela zawiera pole BLOB, które reprezentuje plik. Plik może być bardzo duży.Bardzo duży ciąg do tablicy bajtowej
Tak więc w przypadku, gdy mam bardzo duży plik, pobierz w XML bardzo dużą reprezentację ciągów tego pliku.
Muszę pobrać bajty tego ciągu, aby wstawić plik do innej instancji bazy danych.
W tym punkcie XML jest ładowany i mam ciąg znaków reprezentujący plik.
Co robiłem to:
Encoding.Unicode.GetBytes(stringFileRepresentation);
Ale jestem coraz OutOfMemoryException
.
Gdybym to zrobić:
Encoding.Unicode.GetBytes(stringFileRepresentation.ToCharArray());
uzyskać także OutOfMemoryException
.
Próbowałem też to zrobić przed dekodowanie ciąg:
var chars = stringFileRepresentation.ToCharArray();
Encoding.Unicode.GetBytes(chars);
I coraz OutOfMemoryException
Dzwoniąc ToCharArray()
.
Domyślam się, że jest to problem, gdy przetwarzanie ciąg.
Wtedy staram następującą metodę, że znalazłem here zdarzenie jeśli nie jestem pewien, że mam do conservate kodowanie wyrażenie:
byte[] bytes = new byte[str.Length * sizeof(char)];
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
Ale Dostaję również OutOfMemoryException
w uruchamianiu zmienna bytes
.
Teraz uruchomiłem OutOfOptions
i nie wiem, co robić.
Jak napisać obiekt blob do bazy danych po uzyskaniu tablicy bajtów? Czy istnieje opcja przesyłania strumieniowego? (Idealnie, nie powinieneś mieć całego pliku w pamięci nawet jako ciąg ...). –
Alternatywnie opracuj sposób na bezpośrednie połączenie dwóch baz danych. – samjudson
Zacząłem przeglądać ODP.NET i nie widzę opcji przesyłania strumieniowego. Wygląda na to, że musisz samemu podzielić to na części i po prostu dołączyć pole do bazy danych. Może napisać SPROC, który doda bajty do bieżącego pola i pętlę wywołujące wstawianie porcji, dopóki nie wstawisz całego obiektu. – Wjdavis5