Оптимизация замены частей текстовых документов - PullRequest
0 голосов
/ 03 января 2019

Итак, я пытаюсь прочитать кучу файлов .mcfunction (в основном .txt) и заменить вещи, которые содержатся внутри ||с соответствующим номером.Но то, как я это делаю сейчас, приводит к огромному использованию памяти (например, 360 Мб -> 6 Гб), поэтому мне нужна помощь в устранении утечки памяти.Вот в чем проблема:

public void Parse() {
    staticIDs sIDs = GameObject.Find("Main Camera").GetComponent<staticIDs>();
    functions = Directory.GetFiles(@"downloads\", "*.mcfunction", SearchOption.AllDirectories);
    totalFunctions = functions.Length;
    curFunction = 0;
    foreach (string function in functions)
    {
        System.Threading.Thread.Sleep(100);
        string text = File.ReadAllText(function);
        if (text.Contains("|"))
        {
            Debug.Log("Things to parse");
            goto contParse;
        }
        else {
            Debug.Log("No things to parse");
            goto finishParse;
        }
        contParse:
        lines = File.ReadAllLines(function);
        int lineNumber = 0;
        foreach (string line in lines)
        {
            System.Threading.Thread.Sleep(100);
            parts = line.Split('|');
            temp = "";
            int curLine = lineNumber + 1;
            foreach (string part in parts)
            {
                System.Threading.Thread.Sleep(100);
                int IDchecked = 0;
                done = false;

                tryAgain:
                if (IDchecked < sIDs.IDnames.Capacity && sIDs.IDnames[IDchecked] == part)
                {
                    temp = temp + sIDs.IDnumbers[IDchecked].ToString();
                    goto replaced;
                }
                else if (IDchecked <= sIDs.IDnames.Capacity)
                {
                    IDchecked++;
                    goto tryAgain;
                }
                else if (IDchecked > sIDs.IDnames.Capacity)
                {
                    temp = temp + part;
                    goto replaced;
                }
                else
                {
                    goto replaced;
                }
                replaced:
                Debug.Log(temp);
            }
            done = false;
            newLines.Add(temp);
        }
        File.Delete(function);
        File.Create(function).Dispose();
        foreach (string line in newLines)
        {
            File.AppendAllText(function, line);
        }
        finishParse:
        curFunction++;
        if (curFunction > totalFunctions)
            goto move;
    }
    move:
    Debug.Log("got to moving");
    Invoke("Move", 10f);
}

Я бы хотел сократить использование памяти до минимума.

1 Ответ

0 голосов
/ 03 января 2019

Вероятно, утечка памяти вызвана конкатенацией строк.string + string создает новый (неизменный) string.Избегайте их и используйте StringBuilder вместо

вместо temp = temp + something, сделайте temp StringBuilderer и позвоните temp.Append(something)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...