Я бы пошел на пока еще не упомянутый (за исключением комментариев) вариант, упомянутый в теме моего блога о blobstreams : настроить конвейер обработки потоков, которые заботятся о загрузка и интерпретация нужного вам файла. Затем используйте код для чтения интерпретированных записей из этого составного потока и выполните необходимые вставки / обновления в вашей базе данных в рамках одной транзакции (для файла / для каждой записи в соответствии с вашими функциональными требованиями).
Этот сценарий - то, где Stream
классы на основе превосходят. Это будет означать, что во время обработки у вас никогда не будет целого файла ни на диске, ни в памяти одновременно. Как вы упоминали, загрузка файла занимает несколько минут, он может быть большим. Может ли ваша система занять промежуточное хранилище полного файла (может быть, несколько раз: память и на диске)? Даже если несколько файлов обрабатываются одновременно?
Кроме того, если вы обнаружите на практике, что цепочка недостаточно надежна для вас, и вы хотели бы иметь возможность временно сохранить загруженный файл на диск и действительно хотите затем повторить его обработку, не загружая его опять же, это легко. Все, что нужно, - это дополнительный Stream
в конвейере, который будет проверять, находится ли нужный файл уже в вашем кэше «уже загруженных файлов» (в какой-то папке, в изолированном хранилище и т. Д.) И возвращать байты в этом, а не фактически зацикливание загрузки Stream
в ваш конвейер обработки.