Ur Pocok Ответов: 2

NAS: system.io.ioexception: существует недостаточное количество системных ресурсов для завершения запрошенной службы


У меня есть консольное приложение. (C# написан в VSCode), который просматривает файлы (>200000 за раз) и собирает из них данные. Он работает без каких-либо проблем, если исходная и конечная папки находятся на локальном компьютере. Также хорошо, если источником и местом назначения являются общие папки на другом компьютере. Проблема возникает, когда я устанавливаю источник и место назначения, чтобы указать на NAS (общую папку). -> Что-то "особенное" должно быть с NAS.

Вот первая часть кода: он выходит из строя в строке 44: "string [] filePaths = Directory.....

using System;
using System.IO;
using System.Globalization;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Xml.Linq;
using System.Xml;

namespace HuntingDMCs
{
    class Program
    {
        static string pad_an_int(int N, int P) 
    { 
        
        string s = "{0:"; 
        for( int i=0 ; i<P ; i++) 
        { 
            s += "0"; 
        } 
        s += "}"; 
          
        
        string value = string.Format(s, N); 
          
        // return output 
        return value; 
    }
        static void Main(string[] args)
        {
            int P =4;
            int Circuitnumber = 43;
            List<string> circuitcodes = new List<string>();
            //Local string[] filePaths = Directory.GetFiles(@"F:\FECO\Mastercollection\","*.mtag", SearchOption.AllDirectories);
            string[] filePaths = Directory.GetFiles(@"V:\2020-09","*.mtag", SearchOption.AllDirectories);
            //Extract the circuit text file
            // Localos
using (StreamReader sr = new StreamReader("F:\\Feco\\CircuitCodes\\circuitcodes.txt"))
           // Localos
            {


Любая идея приветствуется.

Что я уже пробовал:

- Я пробовал код на разных системах, общих дисках и т. д. всегда используйте ту же папку, что и исходный файл для каталога.getfiles
- Я также попробовал на ПК (отображение его общей папки), который имеет только 2 ГБ памяти.
- Я попробовал два NAS (1-й-Netgear, 2 - й-Qnap, оба имеют память 4 ГБ) -> мой код падает с обоими.
- Я попытался проверить настройки безопасности обоих NAS, но не нашел ничего, что могло бы заблокировать любой доступ. Я могу читать любые файлы на NAS, а также создавать новые, а также папки и т. д.
- И Nas, и другие компьютеры, на которых я пробовал код, находятся в одной сети, на NAS нет никаких специальных правил.

Richard MacCutchan

Сообщение об ошибке совершенно ясно. В системе закончился некоторый ресурс, необходимый для перечисления всех файлов.

Ur Pocok

Да, но что это за ресурс?:)

Richard MacCutchan

Неужели ты всерьез ждешь от меня ответа?

2 Ответов

Рейтинг:
1

OriginalGriff

Возможно, вы достигаете какого - то предела-будь то NAS или ваша локальная система, трудно сказать, но 200 000 файлов в одном запросе-это довольно много, и вполне вероятно, что это превышает некоторый предел дескрипторов в самом NAS.

Возможно, вы захотите попробовать сделать это как набор запросов, а не один; начните с вашей базовой папки и прочитайте файлы, а затем рекурсивно прочитайте каждый из ее подкаталогов самостоятельно. Таким образом, вы можете ограничить фактические дескрипторы, используемые вашим запросом, и это может сработать - я не могу сказать, я понятия не имею, сколько файлов у вас есть в папке на вашем NAS, но, конечно, мой 16-ТБ NAS может быть прочитан рекурсивно, и он заполнен более чем на 3/4!

В качестве побочного вопроса, если вы собираетесь добавить более 200 000 значений к своему circuitcodes тогда вы должны знать, что будете использовать довольно много памяти во временных массивах: List<T> - действительно ли это так эффективно, как вы, вероятно, думаете?[^]
Хорошей идеей может быть установка большей "начальной емкости" для списка.


Ur Pocok

Ваше предположение с пределом кажется правильным.
Я сделал некоторый тест с двумя папками в качестве источника для getfiles (2020-09 и 2020-08).
Оба содержат много подпапок, все подпапки должны содержать один файл .mtag и, возможно, несколько файлов .png.
Я попытался найти точку, где код все еще работает (еще одна подпапка и сбой)
Этот пункт относится к 2020-09 годам:
Общее количество файлов: 95202
Общее количество папок: 16457
Размер: 16,1 ГБ
Количество файлов mtag: 16378

Этот пункт относится к 2020-08 годам:
Общее количество файлов: 154282
Общее количество папок: 16471
Размер: 28,3 ГБ
Количество файлов mtag: 16378

Вне если выглядит проблема в количестве файлов mtag,
но я сделал и другой тест -> Чтобы скопировать только .mtags из всей папки 2020-09. Это означает ~33K .mtag файлов. Мой код проходит через них без каких-либо проблем - > Это не может быть просто количество .mtags.

Другая возможность из моих тестов-это количество папок, их количество тоже очень близко, но я не уверен...

Список не является проблемой, я хочу добавить туда максимум несколько сотен записей в разделе Streamreader.

Ur Pocok

Еще один тест сегодня утром: я скопировал все файлы (230000) из структуры папок 2020-09 в другую папку без каких-либо вложений - > без вложений в каталог.Getfiles также отлично работает на NAS.
Теперь просто нужно выяснить, почему большое количество подпапок является проблемой при получении файлов с NAs, и почему бы не сделать то же самое с настольного ПК:S

Рейтинг:
0

Richard MacCutchan

Я предлагаю вам взглянуть на раздел замечаний о Каталог.Метод GetFiles (System.IO) | Microsoft Docs[^]. Возможно, что использование Каталог.Метод EnumerateFiles (System.IO) | Microsoft Docs[^] не только более эффективен, но и может избежать проблемы, которую вы видите.


Dave Kreskowiak

Я поддерживаю это. Это гораздо лучший подход для перечисления файлов, а не просто загрузки их всех в память.

Метод перечисления работает с любым количеством файлов, в то время как загрузка их всех в память сразу ограничена памятью для хранения списка.

Ur Pocok

Метод EnumerateFiles здесь не помогает.
Для 1-го я уже пробовал - забыл разместить в поле "что я пробовал", извините.
2-й: эта проблема появляется только тогда, когда я получаю файлы с NAS! Он отлично работает с локального компьютера или любых общих дисков указывает на другой компьютер (также на компьютер, который имеет меньше памяти, чем мой NAS)