Можно ли замедлить рекурсивный поиск PowerShell?

Если вы не хотите использовать aggregate, другое решение должно использовать find, а затем сортировать результаты на стороне клиента с помощью array#sort :

Если значения $in являются примитивными типами, такими как числа, вы можете использовать такой подход, как:

var ids = [4, 2, 8, 1, 9, 3, 5, 6];
MyModel.find({ _id: { $in: ids } }).exec(function(err, docs) {
    docs.sort(function(a, b) {
        // Sort docs by the order of their _id values in ids.
        return ids.indexOf(a._id) - ids.indexOf(b._id);
    });
});

Если значения $in являются непримитивными типами, например ObjectId s, требуется другой подход поскольку indexOf сравнивается по ссылке в этом случае.

Если вы используете Node.js 4.x +, вы можете использовать Array#findIndex и ObjectID#equals , чтобы отрегулировать это, изменив функцию sort на:

docs.sort((a, b) => ids.findIndex(id => a._id.equals(id)) - 
                    ids.findIndex(id => b._id.equals(id)));

Или с любой версией Node.js, с подчеркиванием / lodash's findIndex :

docs.sort(function (a, b) {
    return _.findIndex(ids, function (id) { return a._id.equals(id); }) -
           _.findIndex(ids, function (id) { return b._id.equals(id); });
});

2
задан briantist 16 January 2019 в 01:42
поделиться

2 ответа

Invoke-команда имеет параметр -throttle, который может помочь. Это ограничивает количество потоков, поэтому может помочь ограничить пропускную способность.

0
ответ дан Matt Browne 16 January 2019 в 01:42
поделиться

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | 
    ForEach-Item -Process {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

filter Delay-Object ([int]$Milliseconds) {
    Start-Sleep -Milliseconds $Milliseconds
    

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

# have to return the original object back to the pipeline } | Select-String findme

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

} Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | Delay-Object -Milliseconds 1000 | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

# have to return the original object back to the pipeline } | Select-String findme

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

} | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

filter Delay-Object ([int]$Milliseconds) {
    Start-Sleep -Milliseconds $Milliseconds
    

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

# have to return the original object back to the pipeline } | Select-String findme

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

} Get-ChildItem -path C:\ -recurse -Filter *.txt -ErrorAction Continue | Delay-Object -Milliseconds 1000 | Select-String -Pattern "xxxx" | select filename, Linenumber, Line, Path | Format-Table

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    # do your search here
}

Вы можете просто ввести задержку прямо в вашу итерацию:

Get-ChildItem \\my\share\*.* | ForEach-Object {
    Start-Sleep -Seconds 1
    # do your search here
}

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

Get-ChildItem \\my\share\*.* | Select-String findme

Тогда решение остается тем же: вставьте ForEach-Object!

Get-ChildItem \\my\share\*.* | 
    ForEach-Object {
        Start-Sleep -Seconds 1
        

С добавлением вашего кода, я думаю, я был на правильном пути. Исходный код (немного отформатированный):

[110]

Хотите, чтобы он выглядел более идиоматичным? Напишите свою собственную функцию, которая принимает входные данные конвейера и задерживает выполнение. Я мог бы даже использовать a filter, который является кратким способом написания функции с поддержкой конвейера :

[111]

Без вашего кода это чистое предположение, но допустим, вы вы делаете что-то вроде этого:

[112]

Вы можете просто ввести задержку прямо в вашу итерацию:

[113]

Если вы не используете свой собственный блок скрипта, скажем, вы Вы используете Select-String:

[114]

Тогда решение остается тем же: вставьте ForEach-Object!

[115]

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

# have to return the original object back to the pipeline } | Select-String findme

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

Каждый найденный элемент будет передаваться следующей команде в конвейере одна за другой, поэтому ваши задержки будут между каждым элементом. Следовательно, вы можете вставить задержку между любыми конвейерными командами.

* некоторым конвейерным командам, таким как Sort-Object, необходимо собрать все элементы и затем сразу передать их всем; из POV следующих команд он все еще выглядит так же, но он изменит то, как / где вам нужно помещать задержки.

0
ответ дан briantist 16 January 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: