Можно ли объяснить понятие потоков?

Я не тестировал этот код, но, возможно, он может помочь вам или дать представление о том, как решить проблему.

raster_path = "D:/MODIS/"
# ...
with os.scandir(raster_path) as p:
    for raster in p:
        if not raster.name.startswith('.') and entry.is_file():
            raster = gdal.Open(raster.name)
            bands = raster.RasterCount
            # ...

Это должно выглядеть примерно так.

row_list2000 = [] # I'm guessing that should be out of the loop.
raster_path = "D:/MODIS/" # That's the folder you want to search in for raster files.

with os.scandir(raster_path) as p: # Open the folder containing the rasters as p.
    for raster in p: # Get each raster in the folder.
        if not raster.name.endswith(".tif"): # Only show the files whose name ends with dot tif.
            raster_file = os.path.join(raster_path, raster.name)) # Get the full path of the raster, you'll need it in order to open the raster file and access its data. 
            raster = gdal.Open(raster_file) # Open the current raster file.

            # The rest is your code...

            bands = raster.RasterCount

            for band in range(1, bands+1):
                data = raster.GetRasterBand(band).ReadAsArray().astype('float')
                mean = np.mean(data[data != 0]) #calculate mean without value 0
                row_list2000.append({
                    'raster': os.path.basename(raster_name),
                    'band': band,
                    'mean': mean,
                    'year': 2000,
                    'date': 325,
                })
                print("Band %s: Mean = %s" % (band, round(mean, 2)))

Если вы используете версию Python ниже 3.6 (как я). Вам нужно заменить

with os.scandir(path) as p:
    for f in p:
        print(f.name)

на

for p in os.scandir(path):
    print(f.name)

, иначе вы получите ошибку AttributeError: __exit__.

178
задан Hosam Aly 15 July 2018 в 11:36
поделиться

12 ответов

Слово "поток" было выбрано, потому что это представляет (в реальной жизни) очень похожее значение к тому, что мы хотим передать, когда мы используем его.

Позволяют нам забыть о запоминающем устройстве для немного и начать думать об аналогии с водным потоком. Вы получаете непрерывный поток данных, точно так же, как вода непрерывно течет в реке. Вы не обязательно знаете, куда данные прибывают из, и чаще всего Вы не должны; будьте этим из файла, сокета или любого другого источника, это не делает (не был должен) действительно иметь значение. Это очень похоже на получение потока воды, посредством чего Вы не должны знать, куда это прибывает из; будьте этим от озера, фонтана или любого другого источника, это не делает (не был должен) действительно иметь значение.

Тем не менее, после того как Вы начинаете думать, что Вы только заботитесь о получении данных, в которых Вы нуждаетесь, независимо от того, куда это прибывает из, абстракции, другие люди говорили о более ясном ставшем. Вы начинаете думать, что можно перенести потоки, и методы будут все еще работать отлично. Например, Вы могли сделать это:

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

, Как Вы видите, становится очень легко изменить Ваш входной источник, не изменяя Вашу логику обработки. Например, для чтения данных с сетевого сокета вместо файла:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

Столь легкий, как это может быть. И красота продолжает, поскольку можно использовать любой вид входного источника, пока можно создать поток "обертка" для него. Вы могли даже сделать это:

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

Посмотрите? Пока Ваш метод не заботится, каков входной источник, можно настроить источник различными способами. Абстракция позволяет Вам отделять вход от обработки логики очень изящным способом.

Примечание, которое поток мы создали сами, не имеет запоминающего устройства, но это все еще служит нашим целям отлично.

Так, для суммирования поток является просто источником входа, скрываясь (абстрагирующий) другой источник. Пока Вы не повреждаете абстракцию, Ваш код будет очень гибок.

226
ответ дан Hosam Aly 23 November 2019 в 20:16
поделиться

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

хорошая аналогия могла бы быть должна рассмотреть сумку. Вы не заботитесь о том, из чего сделана сумка или что она делает при помещении материала в нее, пока сумка выполняет задание того, чтобы быть сумкой, и можно вернуть материал. Поток определяет для носителей, что понятие сумки определяет для различных экземпляров сумки (таких как мешок для мусора, сумочка, рюкзак, и т.д.) - правила взаимодействия.

0
ответ дан Jeff Yates 23 November 2019 в 20:16
поделиться

Поток является абстракцией последовательности байтов. Идея состоит в том, что Вы не должны знать, куда байты прибывают из, просто что можно считать их стандартизированным способом.

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

нет ничего неправильно серовато-синего со взаимодействием с самим запоминающим устройством за исключением того, что это связывает Вас с реализацией запоминающего устройства.

0
ответ дан Sean 23 November 2019 в 20:16
поделиться

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

точка потока - то, что мы ограничиваем наше внимание к тому, что важно. При наличии стандартной абстракции мы можем выполнить общие операции. Даже если Вы не хотите, например, ищите файл или ответ HTTP для URL сегодня, не подразумевайте, что Вы не будете хотеть завтра.

Потоки были первоначально задуманы, когда память была крошечной по сравнению с устройством хранения данных. Просто чтение файла C могло быть значительной загрузкой. Уменьшение объема потребляемой памяти было чрезвычайно важно. Следовательно, абстракция, в которой очень мало должен был быть загружен, была очень полезна. Сегодня, это одинаково полезно при выполнении сетевой связи и, оказывается, редко настолько строгим, когда мы имеем дело с файлами. Способность прозрачно добавить вещи как буферизация общим способом делает это еще более полезным.

1
ответ дан Julian Birch 23 November 2019 в 20:16
поделиться

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

1
ответ дан Anton Gogolev 23 November 2019 в 20:16
поделиться

Лучшее объяснение потоков, которые я видел, глава 3 SICP. (Вы, возможно, должны прочитать первые 2 главы для него, чтобы иметь смысл, но Вы должны так или иначе. :-)

Они не используют потоки для байтов вообще, а скорее целые числа. Большие мысли, которые я понял от него, были:

  • Потоки отложены, перечисляет
  • вычислительные издержки [нетерпеливых вычислений, все заранее, в некоторых случаях] возмутительно
  • , Мы можем использовать потоки для представления последовательностей, которые являются бесконечно длинны
3
ответ дан Ken 23 November 2019 в 20:16
поделиться

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

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

Во-первых это упрощает сами компоненты: если Вы хотите поместить шоколадное обледенение на пирог, Вам не нужно сложное устройство, которое знает все о пирогах, можно создать немое устройство, которое засовывает шоколадное обледенение на то, что питается в него (в мультфильмах, это идет до не знания, что следующий объект в не является пирогом, это - Wile E. Coyote).

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

, В-третьих, устройства не должны управлять материально-техническими ресурсами, упаковкой или распаковыванием. Самый эффективный способ агрегироваться и упаковать вещи изменяем: возможно, сегодня Вы помещаете свои пироги в поля 48 и отсылаете их грузовиком, но завтра Вы хотите отослать поля шесть в ответ на пользовательские заказы. Этот вид изменения может быть размещен путем замены или реконфигурирования машин в запуске и конце производственной линии; вишневая машина посреди строки не должна быть изменена для обработки другого количества объектов за один раз, это всегда работает с одним объектом за один раз, и это не должно знать, как его ввод или вывод группируется.

4
ответ дан 23 November 2019 в 20:16
поделиться

Это - просто понятие, другой уровень абстракции, которая делает Вашу жизнь легче. И у них всех есть единый интерфейс, что означает, что можно объединить их в канале как способ. Например, закодируйте к base64, затем архивируйте и затем запишите это в диск и все в одной строке!

4
ответ дан vava 23 November 2019 в 20:16
поделиться

Для добавления к эхо-камере поток является абстракцией, таким образом, Вы не заботитесь о базовом хранилище. Это имеет большую часть смысла, когда Вы рассматриваете сценарии с и без потоков.

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

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

Скажем, я сделал, чтобы своего рода TcpDataStream возразил. Я создаю его с соответствующей информацией о соединении, затем читаю байты из потока, пока это не говорит, что больше нет байтов. Поток обрабатывает организацию буферизации данных, условия конца данных и управление соединениями.

Таким образом, потоки делают ввод-вывод легче. Вы могли, конечно, записать класс TcpFileDownloader, который делает то, что делает поток, но затем у Вас есть класс, это характерно для TCP. Большинство потоковых интерфейсов просто обеспечивает Чтение () и Запись () метод, и больше сложные понятия обрабатываются внутренней реализацией. Из-за этого можно использовать тот же абсолютный код, чтобы читать или записать в память, дисковые файлы, сокеты и много других хранилищ данных.

7
ответ дан OwenP 23 November 2019 в 20:16
поделиться

Это не о потоках - это о плавании. Если можно плавать один Поток, чем можно плавать какой-либо Поток, Вы встречаетесь.

11
ответ дан dmajkic 23 November 2019 в 20:16
поделиться

Точка потока должна обеспечить слой абстракции между Вами и запоминающим устройством. Таким образом данный блок кода, который использует поток, не должен заботиться, является ли запоминающее устройство дисковым файлом, памятью, и т.д.

30
ответ дан Torlack 23 November 2019 в 20:16
поделиться

Дело в том, что Вам не придется знать то, что запоминающее устройство - это - абстракция по нему. Действительно, там даже не мог бы быть запоминающее устройство - Вы могли читать из сети, и данные никогда не "хранятся" вообще.

, Если можно написать код, который работает, говорите ли Вы с файловой системой, памятью, сетью или чем-либо еще, что поддерживает потоковую идею, Ваш код намного более гибок.

, Кроме того, потоки часто объединяются в цепочку вместе - у Вас может быть поток, который сжимает то, что помещается в него, пишущий сжатую форму на другом потоке или ту, которая шифрует данные, и т.д. В другом конце, была бы обратная цепочка, дешифрование, распаковка или что бы то ни было.

36
ответ дан Jon Skeet 23 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

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