Más

¿La línea de búfer en ArcMap está creando un búfer más pequeño de lo esperado?

¿La línea de búfer en ArcMap está creando un búfer más pequeño de lo esperado?


Cuando coloco en búfer un punto (punto rojo en la imagen) por 3 millas, son 3 millas en todos los lados. Cuando coloco en búfer una línea (línea azul en la imagen) por 3 millas, es más como 2.67 millas en los lados paralelos a la línea. Probé varias proyecciones, pero básicamente obtengo el mismo resultado.

¿Alguna idea sobre por qué sucede esto o soluciones alternativas?


Al almacenar en búfer (entre otras operaciones relacionadas con la distancia) en un geográfico sistema de coordenadas, su resultado puede aparecer o distorsionarse en 2D porque la ubicación geográfica está en una esfera / elipsoide, no en un plano. Geographic utiliza grados angulares para la medición, y un grado de longitud puede variar significativamente en términos de distancia dependiendo de la latitud (que es relativamente consistente). Entonces, lo que aparece como un círculo cerca del ecuador sería una elipse muy aplastada cerca de los polos; consulte la indicatriz de Tissot.

Si estas en un proyectado sistema de coordenadas (como una zona de plano de estado), esa superficie esférica / 3D se ha aplanado, con algo de distorsión, a un plano 2D. Por lo tanto, cuando crea su búfer, los resultados deberían ser mucho más consistentes en términos de distancia, aunque posiblemente inexactos en grandes distancias. El artículo de Esri Comprensión de la zona de influencia geodésica ofrece una explicación detallada.

Parece que se ha encontrado con un problema con el sistema de coordenadas de datos original siendo geográfico, la reproyección sobre la marcha no está configurada correctamente o el búfer usando el CRS original (como geográfico) y no el marco de datos (como proyectado). Tenga en cuenta también que si dos CRS o proyecciones tienen diferentes referencias, también debe especificar una transformación correcta para el marco de datos a utilizar (hay otras preguntas aquí sobre ese tema).

Relacionados:


Std :: búfer fstream vs búfer manual (¿por qué ganancia 10x con búfer manual)?

Pero mi almacenamiento en búfer manual mejora el rendimiento en un factor de 10 para escribir un archivo de 100 MB, y el almacenamiento en búfer de fstream no cambia nada en comparación con la situación normal (sin redefinir un búfer).

¿Alguien tiene una explicación de esta situación?

EDITAR: Aquí están las noticias: un punto de referencia recién hecho en una supercomputadora (arquitectura linux de 64 bits, dura intel Xeon de 8 núcleos, sistema de archivos Lustre y, con suerte, compiladores bien configurados) (y no explico la razón de la "resonancia" para un búfer manual de 1kB).

EDICIÓN 2: Y la resonancia en 1024 B (si alguien tiene una idea al respecto, estoy interesado):


fgets () usa getc () internamente, para leer un carácter a la vez, hasta que lee una nueva línea o alcanza el límite que se le dio. Siempre que getc () llegue al final del búfer de E / S, volverá a llenar el búfer, por lo que no está limitado al tamaño establecido por setvbuf (). Establecer un tamaño de búfer pequeño solo lo hace menos eficiente, pero no cambia la cantidad de datos que se pueden leer.

setvbuf asocia con el archivo un búfer de tamaño 10.

Está leyendo el archivo con fgets e intentando leer 45 bytes. Dado que el búfer del archivo es de tamaño 10 (y la opción _IOLBF), esto significa que la lectura se realiza de esta manera:

  1. Leer bytes 0-9 del archivo a mystring
  2. Leer bytes 10-19.
  3. Leer bytes 20-29.
  4. Leer bytes 30-39.
  5. Lee los bytes 40-45 y se detiene en n

En lugar de usar un búfer predeterminado y probablemente leer todos los bytes a la vez (sin rellenar el búfer)

La diferencia sin y con setvbuf es,

fgets () lee 4096 unidades de bytes a la vez. setvbuf es la forma de controlar el tamaño del búfer mientras se lee.

El modo de almacenamiento en búfer se establece en _IOLBF = búfer de línea, de acuerdo con la página de manual de setvbuf ". Cuando es un búfer de línea, los caracteres se guardan hasta un salto de línea".

Debería almacenar en búfer solo 10 bytes, pero fgets aún leería la línea completa.

Buffering significa que los datos internos se leen para buff, cuando el buff está lleno o en línea, también cuando se lee un Newline, el búfer se sobrescribe.


12 respuestas 12

Esto hizo el trabajo (en el año 2012):

Acabo de cronometrar 8 GB en 36 segundos, que son aproximadamente 220 MB / sy creo que eso maximiza mi SSD. También vale la pena señalar que el código en la pregunta usó un núcleo al 100%, mientras que este código solo usa 2-5%.

Actualizar: Han pasado 5 años, estamos en 2017. Los compiladores, el hardware, las bibliotecas y mis requisitos han cambiado. Es por eso que hice algunos cambios en el código e hice algunas mediciones nuevas.

Este código se compila con Visual Studio 2017 y g ++ 7.2.0 (nuevos requisitos). Ejecuté el código con dos configuraciones:

  • Computadora portátil, Core i7, SSD, Ubuntu 16.04, g ++ Versión 7.2.0 con -std = c ++ 11 -march = native -O3
  • Escritorio, Core i7, SSD, Windows 10, Visual Studio 2017 versión 15.3.1 con / Ox / Ob2 / Oi / Ot / GT / GL / Gy

Lo que dio las siguientes medidas (después de deshacerse de los valores de 1 MB, porque eran valores atípicos obvios): Tanto la opción 1 como la opción 3 maximizan mi SSD. No esperaba que esto se viera, porque la opción 2 solía ser el código más rápido en mi vieja máquina en ese entonces.

TLDR: Mis medidas indican usar std :: fstream sobre FILE.

Intente lo siguiente, en orden:

Tamaño de búfer más pequeño. Escritura

2 MiB a la vez podría ser un buen comienzo. En mi última computadora portátil

512 KiB fue el punto óptimo, pero aún no lo he probado en mi SSD.

Nota: He notado que los búferes muy grandes tienden a disminución actuación. He notado pérdidas de velocidad con el uso de búferes de 16 MiB en lugar de búferes de 512 KiB antes.

Use _open (o _topen si desea ser correcto para Windows) para abrir el archivo, luego use _write. Esta voluntad probablemente evitar mucho almacenamiento en búfer, pero no es seguro que lo haga.

Usando funciones específicas de Windows como CreateFile y WriteFile. Eso evitará el almacenamiento en búfer en la biblioteca estándar.

No veo ninguna diferencia entre std :: stream / FILE / device. Entre búfer y no búfer.

  • Las unidades SSD se "alargan" para ralentizarse (velocidades de transferencia más bajas) a medida que se llenan.
  • Las unidades SSD se "tienden" a ralentizarse (velocidades de transferencia más bajas) a medida que envejecen (debido a bits que no funcionan).

Veo que el código se ejecuta en 63 segundos.
Por lo tanto, una tasa de transferencia de: 260 M / s (mi SSD parece un poco más rápido que el tuyo).

No obtengo un aumento al pasar a FILE * desde std :: fstream.

Entonces, la secuencia de C ++ está funcionando tan rápido como lo permite la biblioteca subyacente.

Pero creo que es injusto comparar el sistema operativo con una aplicación construida sobre el sistema operativo. La aplicación no puede hacer suposiciones (no sabe que las unidades son SSD) y, por lo tanto, utiliza los mecanismos de archivo del sistema operativo para la transferencia.

Mientras que el sistema operativo no necesita hacer suposiciones. Puede indicar los tipos de unidades involucradas y utilizar la técnica óptima para transferir los datos. En este caso, una transferencia directa de memoria a memoria. Intente escribir un programa que copie 80G de una ubicación en la memoria a otra y vea qué tan rápido es.

Cambié mi código para usar las llamadas de nivel inferior:
es decir, sin almacenamiento en búfer.

NOTA: Mi unidad es una unidad SSD si tiene una unidad normal, es posible que vea una diferencia entre las dos técnicas anteriores. Pero como esperaba, el no almacenamiento en búfer y el almacenamiento en búfer (cuando se escriben fragmentos grandes más grandes que el tamaño del búfer) no hacen ninguna diferencia.

Edición 2:

¿Ha probado el método más rápido para copiar archivos en C ++?

La mejor solución es implementar una escritura asíncrona con doble búfer.

La 'F' representa el tiempo de llenado del búfer y la 'W' representa el tiempo de escritura del búfer en el disco. Entonces, el problema es perder tiempo entre escribir búferes en un archivo. Sin embargo, al implementar la escritura en un hilo separado, puede comenzar a llenar el siguiente búfer de esta manera:

F - llenado del primer búfer
f - llenado del segundo búfer
W - escribiendo el primer búfer en un archivo
w - escribiendo el segundo búfer en el archivo
_ - espere mientras se completa la operación

Este enfoque con intercambios de búfer es muy útil cuando el llenado de un búfer requiere un cálculo más complejo (por lo tanto, más tiempo). Siempre implemento una clase CSequentialStreamWriter que oculta la escritura asincrónica en su interior, por lo que para el usuario final la interfaz solo tiene funciones de escritura.

Y el tamaño del búfer debe ser múltiplo del tamaño del clúster de discos. De lo contrario, terminará con un rendimiento deficiente si escribe un solo búfer en 2 clústeres de discos adyacentes.

Escribiendo el último búfer.
Cuando llame a la función Write por última vez, debe asegurarse de que el búfer actual que se está llenando también debe escribirse en el disco. Por lo tanto, CSequentialStreamWriter debería tener un método separado, digamos Finalize (vaciado final del búfer), que debería escribir en el disco la última porción de datos.

Manejo de errores.
Mientras que el código comienza a llenar el segundo búfer y el primero se escribe en un hilo separado, pero la escritura falla por alguna razón, el hilo principal debe ser consciente de ese error.

Supongamos que la interfaz de un CSequentialStreamWriter tiene la función Write que devuelve bool o lanza una excepción, por lo tanto, al tener un error en un hilo separado, debe recordar ese estado, por lo que la próxima vez que llame a Write o Finilize en el hilo principal, el método regresará False o lanzará una excepción. Y realmente no importa en qué punto dejó de llenar un búfer, incluso si escribió algunos datos antes de la falla; lo más probable es que el archivo esté dañado e inútil.


Métodos

Ecuaciones modelo

(1) (2)

Representación de flujo

Modelamos el flujo en la caja como una combinación de flujo medio y de marea, de modo que , con velocidades hacia la tierra positivas y velocidades hacia el mar negativas. Velocidad media promediada en el tiempo, , se fijó en −0,01 o −0,05 m / s porque limita la mayor parte del rango de velocidades medias observadas en el lecho de los pastos marinos (Apéndice S1: Tabla S1). Velocidad de marea, tude marea(t), se modeló en función de la profundidad del agua. Supusimos un flujo medio de profundidad promedio negativo (hacia el mar) en nuestra pradera de hierba marina poco profunda debido a la estructura lateral típica de la circulación estuarina media en los estuarios positivos (el agua del océano es más densa que el agua del estuario), que presenta un flujo neto hacia la tierra en regiones más profundas y hacia el mar neto. flujo en regiones menos profundas (Geyer y Maccready 2014). Mientras que partes del interior de la bahía de Tomales se vuelven hipersalinas en el otoño, gran parte de la bahía mantiene un gradiente de densidad positivo durante los meses de verano debido al calentamiento solar (un "estuario térmico" Largier et al. 1996), lo que justifica los supuestos de flujo neto hacia el mar a lo largo de las orillas. de la ría donde se encuentran las praderas de eelgrass.

Modelamos el flujo de las mareas, tude marea(t), en función de los cambios en la profundidad del agua, tude marea(t) = α dh(t + )/dt donde α es un coeficiente adimensional proporcional a la magnitud de la velocidad media (). Los valores de α no se eligieron para representar una relación física particular entre el flujo de marea y el flujo medio, sino que se eligieron en un esfuerzo simple para generar flujos medios reversibles (es decir, ambos tu(t) & gt 0 y tu(t) & lt 0) con un rango de velocidad de marea aproximadamente cuatro veces mayor que la magnitud de la velocidad media promediada en el tiempo (). Representamos el desfase entre el flujo de la marea y los cambios en la profundidad del agua con . Nosotros usamos = 0 h para representar una onda estacionaria y = −3 h para representar una onda progresiva.

Química de límites y configuraciones del modelo

Química del agua en condiciones de contorno, DICeny TAen, se simularon utilizando estimaciones estuarinas y oceánicas basadas en observaciones de la bahía de Tomales y las aguas costeras adyacentes (Smith y Hollibaugh 1997, Feely et al. 2016). Para obtener una idea de cómo las condiciones hidrodinámicas afectan el potencial de amortiguación de la hierba marina, consideramos dos conjuntos de condiciones de contorno. En la primera configuración del modelo, mantuvimos el oceánico (DICOceano y TAOceano) y el estuario (DICestuario y TAestuario) condiciones de contorno constantes (en lo sucesivo, "límites fijos"). La configuración de este modelo simuló una pradera de hierba marina donde los volúmenes de reservorio oceánico y estuarino a cada lado de la "caja" de la pradera de hierba marina son grandes en relación con el volumen de agua sobre la pradera (es decir, "dentro de la caja"). La configuración de los límites fijos simuló una condición en la que cualquier modificación biogeoquímica del agua de mar dentro de la pradera no afecta los depósitos de los límites. Bajo estos límites fijos, durante una marea de crecida, las aguas oceánicas se advectaron en la caja, y en una marea baja las aguas de los estuarios se advectaron en la caja (Fig. 1).

En la configuración del segundo modelo, permitimos que la pradera de eelgrass intercambiara agua con una caja lateral oceánica y una caja lateral estuarina de igual volumen que la pradera eelgrass (subíndices os y es, respectivamente, en lo sucesivo denominados "recuadros laterales"). La configuración de las cajas laterales se estableció para simular condiciones en las que el agua que pasa sobre la pradera de eelgrass no proviene de depósitos infinitamente grandes en los lados de la pradera, sino de volúmenes finitos de agua sujetos a modificación por advección de la pradera de eelgrass. . Esta configuración de modelo proporciona un término medio entre la configuración de límites fijos, donde la química de carbonatos de los reservorios oceánicos y estuarinos es fija, y un sistema cerrado sin advección donde todos los cambios de la química del agua en la caja del prado de hierba marina provienen de la fotosíntesis y la respiración.

(3)

Las ecuaciones de balance de masa para los recuadros laterales describen flujos advectivos desde ambos límites (dependiendo de la direccionalidad del flujo) y son análogos a los términos de flujo advectivo en los balances de masa DIC y TA para el recuadro de pradera de eelgrass. No consideramos ningún flujo de carbono de la producción localizada en los recuadros laterales (representados en la Fig. 1b por la ausencia de hierba marina dentro de los recuadros laterales). Cuando el agua fluye del océano al estuario (tu(t) & gt 0), el agua dentro de la caja del lado oceánico advecta en la caja de la pradera y la caja de la pradera adverte su agua modificada biogeoquímicamente hacia la caja del lado del estuario. Cuando el flujo se invierte de tal manera que el agua fluye desde el estuario hasta el océano (tu(t) & lt 0), el agua dentro de la caja del lado del estuario advecta en la caja de la pradera y la caja de la pradera advecta su agua modificada biogeoquímicamente hacia la caja del lado oceánico. Reconociendo que las cajas laterales en sí mismas se ven afectadas por la advección de ambos límites, decidimos advectar los embalses estuarinos y oceánicos estáticos en las cajas laterales respectivas dependiendo de la direccionalidad del flujo (es decir, DICOceano y TAOceano advect en la caja lateral oceánica cuando tu(t) & gt 0 DICestuario y TAestuario advect en la caja del lado del estuario cuando tu(t) & lt 0). Tenga en cuenta que cuando tu(t) & lt 0, usamos |tu(t) | en las ecuaciones de advección-reacción para que el gradiente de concentración siempre se pueda presentar como entrante-saliente.

Tasas de fotosíntesis y respiración

Tasas de fotosíntesis bruta integradas verticalmente, PAGgramoy respiración, R, por la población de pastos marinos se parametrizaron como funciones de abundancia de pastos marinos, irradiancia descendente y química de carbonatos basados ​​en una serie de simulaciones de modelos calibrados para la bahía de Tomales utilizando el modelo bioóptico de pastos marinos GrassLight (Zimmerman et al. 2015). Aproximamos la abundancia de hierba marina usando un índice de área foliar unilateral (LAI = m 2 hoja / m 2 de fondo marino) porque proporciona un fuerte vínculo entre las propiedades ópticas de las hojas y las tasas metabólicas específicas de la biomasa (Zimmerman 2006). La irradiancia solar entrante en la parte superior del dosel de hierba marina se modeló en función de la irradiancia solar entrante modelada en la superficie del agua y el coeficiente de atenuación de la luz. KD, específico de las propiedades bioópticas de Tomales Bay (consulte el Apéndice S1 para obtener información adicional sobre la irradiancia solar y KD cálculos). Modelamos la distribución vertical de la biomasa de hojas de hierba marina dentro del dosel como una función sigmoidea de la altura a una distancia de 1 m sobre el fondo marino, con hojas orientadas a 15 ° de la vertical (Zimmerman 2003), de modo que la altura del dosel realizada fue de 0,97 m. . Cuando la profundidad del agua era menor que la altura del dosel de la hierba marina, se suponía que la fracción de la copa de la hierba marina sobre el agua flotaba en la superficie del agua. Detalles sobre la dependencia de PAGgramo y R sobre la química de los carbonatos dentro de la pradera se puede encontrar en el Apéndice S1.

Dado que el objetivo de este estudio es evaluar y cuantificar el potencial amortiguador que ofrece la hierba marina, las tasas metabólicas son solo para la hierba marina y no incluyen contribuciones de otros procesos bentónicos o de columna de agua (ver Discusión para más detalles). La dependencia parcial de PAGgramo y R sobre la química del carbonato conduce al acoplamiento entre el metabolismo de la hierba marina y la química del agua suprayacente, de modo que el metabolismo de la hierba marina es una función de la química del agua suprayacente y la química del agua suprayacente es una función del metabolismo de la hierba marina. En el Apéndice S1 se proporcionan detalles sobre las parametrizaciones de la tasa metabólica.

Otros flujos de carbono

No incluimos la calcificación neta (precipitación menos disolución de carbonato de calcio) en nuestros balances de masa para DIC y TA porque normalmente no es un proceso biogeoquímicamente importante en Tomales Bay (Smith et al. 1991). Dado que la modificación biogeoquímica de TA dentro de la pradera está controlada solo por Rejército de reserva y producción orgánica neta (NP = PAGgramoR), la modificación del TA local dentro de la pradera de hierba marina es típicamente pequeña (& lt20 μmol / kg). Sin embargo, conservamos el balance de masa de TA en el modelo para que esté completo y para que sea posible la portabilidad a otros sistemas. En particular, el modelo tiene aplicabilidad a los sistemas tropicales, donde la calcificación neta es un proceso biogeoquímico importante. Además, los cálculos preliminares mostraron que los flujos de aire / gas de mar son mucho más pequeños que los derivados del metabolismo neto (& lt1% de PAGgramoR). Por lo tanto, se excluyeron los flujos de aire / gas de mar en estos cálculos de balance de masa.

Efecto amortiguador (capacidad amortiguadora)

Definimos el efecto amortiguador, o capacidad amortiguadora, como el cambio en la química del carbonato entre una simulación de control sin eelgrass (representada mediante el establecimiento de LAI = 0) y una simulación de modelo que contiene eelgrass a una densidad determinada (representada por LAI & gt 0). Calculamos los efectos de amortiguación después de mantener constantes todos los demás parámetros del modelo (por ejemplo, condiciones de contorno, estación, velocidad del flujo, fase de marea, etc.) entre las ejecuciones del modelo de control y poblado de eelgrass, de modo que las diferencias en la química de carbonatos son atribuibles únicamente al eelgrass densidad en la caja del modelo.

Resolución del modelo

Las simulaciones del modelo se ejecutaron en un paso de tiempo de 15 minutos en el que cada paso de tiempo resuelve completamente la química del carbonato dentro de la pradera (así como la química del carbonato dentro de las cajas laterales cuando el modelo está configurado para ejecutarse con cajas laterales), junto con eelgrass prado simulado PAGgramo y R. La duración del intervalo de tiempo del modelo es suficiente para capturar la variación intradía en la disponibilidad de luz causada por la rotación de la Tierra. Pero el modelo no incluye la variación a escala meteorológica en la disponibilidad de luz que resulta de las nubes. El modelo incluye fluctuaciones en la profundidad del agua impulsadas por las mareas semidiurnas mixtas.

Bahía de Tomales

Características del sitio

Elegimos parametrizar nuestro modelo generalizado para una pradera de pastos marinos en Tomales Bay, California, EE. UU. (Fig. 2). Ubicada al norte de San Francisco, Tomales Bay es poco profunda, altamente unidireccional (

1 km de ancho) estuario semicerrado de la costa oeste formado en un valle ahogado de la falla de San Andrés (Hearn y Largier 1997 Fig. 2a). Esta región costera experimenta algunos de los vientos favorables de surgencia más fuertes a lo largo de la costa oeste de América del Norte (Largier et al. 2006). El agua dulce ingresa a la bahía desde su extremo sur (Lagunitas Creek) y su lado este (Walker Creek), principalmente durante los meses de invierno. Las aguas en la bahía de Tomales experimentan una amplia gama de condiciones físicas y químicas a medida que el agua recién aflorada se introduce en la bahía y comienza a sufrir modificaciones biogeoquímicas y físicas. La bahía de Tomales es el sitio de una gran economía de acuicultura de bivalvos (Dumbauld et al. 2009), por lo que es probable que los impactos de la acidificación de los océanos tengan ramificaciones económicas y ecológicas.

Las praderas de pastos marinos en la parte superior de la bahía de Tomales se distribuyen en aproximadamente 25 parches entre la desembocadura de la bahía y la isla Hog, ubicada

A 6 km de la desembocadura de la bahía (Fig. 2b). Análisis manual de las dimensiones del parche en la parte superior de la bahía de Tomales utilizando Google Earth Pro1 1 https://www.google.com/earth/desktop/
reveló dimensiones medias de 304 m (eje más largo) × 38 m (eje ortogonal), con un área de parche mediana de

1 ha, que cubre un área total de aproximadamente 40 ha. Esto representa aproximadamente el 10% del área de la bahía entre la desembocadura y la isla Hog.

Variabilidad estacional

Realizamos una serie de corridas de modelos de 30 días diseñadas para simular las condiciones de surgencia de verano, relajación de verano y condiciones de no surgencia de invierno en una pradera de hierba marina en la parte superior de la bahía de Tomales. Las praderas de pastos marinos en esta región experimentan forzamientos tanto de la desembocadura (aguas de origen oceánico) como de la cabecera (aguas de origen estuarino) de la bahía (Largier et al. 1997, Smith y Hollibaugh 1997). Este forzamiento nos permitió probar hipótesis sobre los efectos de la química de los carbonatos de las aguas que inciden en la capacidad amortiguadora de la pradera de eelgrass. Elegimos simular tres condiciones estacionales (surgencia de verano, relajación de verano e invierno) porque proporcionan el máximo contraste en las condiciones ambientales (temperatura, salinidad, química de carbonatos y luz) experimentadas por la pradera de eelgrass en Tomales Bay durante un ciclo anual. Utilizamos el conjunto de datos de química de la columna de agua bimensual de 8 años de Smith y Hollibaugh (1997) recopilados en el interior y el medio de la Bahía de Tomales para construir ciclos anuales compuestos de temperatura, salinidad y química del agua, de los cuales elegimos nuestros valores estacionales. Las fechas de las simulaciones estacionales se eligieron seleccionando los valores máximo y mínimo para la parametrización del índice de afloramiento de Bakun proporcionada en Smith y Hollibaugh para Tomales Bay (1997), que utilizaron como proxy de la fuerza del ciclo de afloramiento anual. Estos máximos y mínimos fueron los días calendario 198 y 16, respectivamente. Por lo tanto, las simulaciones de modelos de verano e invierno comenzaron en los Días Calendario 183 y 1, respectivamente.

Valores de pH seleccionados para el veranoOceano representan un intento de limitar el rango de pH esperado a lo largo de la costa entre períodos de afloramiento y relajación (Feely et al. 2016). PH de inviernoOceano se tomó como 8.1 para representar el retorno de las aguas de la Corriente de California en alta mar a la costa en ausencia de surgencia (Feely et al. 2016). Valores de pHestuario y TAestuario se basaron en el registro compuesto de 8 años de Smith y Hollibaugh (1997). DICOceano se calculó a partir del pHOceano y TAOceano y DICestuario se calculó a partir del pHestuario y TAestuario (Consulte el Código de modelo para obtener detalles sobre los cálculos de la química de carbonatos). Celebramos TAOceano constante e igual a TAestuario para evitar la influencia confusa de los flujos de TA advectivos en nuestra interpretación de las simulaciones del modelo. Finalmente, controlamos la atenuación de la luz en la columna de agua del modelo de caja usando un coeficiente de atenuación de la luz, KD, que fue parametrizado en GrassLight. Para parametrizar el verano KD valor, asumimos la clorofila de verano a (chl a) la concentración fue de 8 μg / L y la concentración de materia suspendida total (TSM) fue de 4 mg / L. Asumimos el invierno chl a La concentración fue de 5 μg / L y la concentración de TSM fue de 4 mg / L para parametrizar el invierno. KD valor (consulte el Apéndice S1 para obtener más detalles). Aunque chl a y TSM se utilizaron para informar estimaciones de las propiedades bioópticas de la columna de agua, no se utilizaron directamente en los cálculos del modelo de caja.

Mantuvimos la temperatura y la salinidad, y por lo tanto ρ, constantes dentro de cada simulación estacional, variando solo entre los escenarios estacionales de acuerdo con la Tabla 1. También repetimos cada simulación cuatro veces, variando la fase de la velocidad entrante con respecto a los cambios en la altura de la marea) de 0 a −3 h para capturar todas las posibles interacciones ciclo de marea-ciclo diel. Los resultados de estas cuatro ejecuciones del modelo se agregaron para representar una distribución más amplia de la modificación del pH esperada dentro de cada escenario de modelado (Fig. 3).

Estación Día de inicio del calendario T (° C) Salinidad pHOceano ejército de reservaOceano pHestuario ejército de reservaestuario
Verano (surgencia) 183 18 35 7.7 2,300 8.0 2,300
Verano (relajación) 183 18 35 8.0 2,300 8.0 2,300
Invierno 1 11 28 8.1 2,200 8.2 2,200

Notas

(a, d) Profundidad del agua, (b, e) velocidad y (c, f) irradiancia solar (radiación fotosintéticamente disponible, PAR) en la parte superior del dosel de eelgrass durante el verano (a – c) y el invierno (d – f ) modelado de escenarios. Las líneas continuas en los paneles b) ye) muestran series de tiempo de velocidad para = −0.01 m / sy las líneas de puntos en los paneles b) ye) muestran series de tiempo de velocidad para = −0,05 m / s. El cambio de fase, , se expresa en horas.

Código de modelo

Realizamos todas las simulaciones del modelo de caja, análisis de datos y trazado en R (R Core Team 2016). Usamos el paquete deSolve para las ecuaciones de balance de masa (Soetaert et al. 2010). Usamos el paquete seacarb para todos los cálculos de química de carbonatos con configuraciones predeterminadas para todas las constantes de equilibrio (Gattuso et al. 2016). Supusimos efectos de presión insignificantes y contribuciones de nitrato, silicato y fosfato en nuestros cálculos de química de carbonatos. Todas las figuras del texto principal y el Apéndice S1 se desarrollaron utilizando el paquete ggplot2 (Wickham 2009).


3. METODOLOGÍA

En esta sección, describimos el proceso de investigación de la ciencia del diseño exploratorio (Holmström et al., 2009) que creó la práctica del frontlog, incluida la forma en que anticipamos los resultados de la implementación y evaluamos nuestro diseño en el contexto del caso. La investigación de la ciencia del diseño normal (van Aken, Chandrasekaran y Halman, 2016) se centra en mejorar la práctica, enfatizando las pruebas de campo y la implementación. La ciencia del diseño exploratorio comparte el interés en mejorar la práctica, sin embargo, el enfoque está en replantear un problema de campo (por ejemplo, Groop, Ketokivi, Gupta y Holmström, 2017), o en explorar formas alternativas de operación, por ejemplo, a través de tecnologías novedosas ( por ejemplo, Hedenstierna et al., 2019). En la investigación de la ciencia del diseño exploratorio, el modelado y la simulación juegan un papel importante, reemplazando la implementación en la exploración de resultados (Hedenstierna et al., 2019). Además, la teoría y la teorización son métodos para anticipar cómo una solución que aún no se ha probado en el campo debe probarse y desarrollarse mejor para su transferibilidad y aplicación a entornos más allá de donde fue diseñada.

El proceso de investigación exploratoria de este artículo se presenta en la Figura 1. La investigación partió del problema de campo de la compañía de casos, Nordic Airline. A través de la exploración y el modelado del diseño, se pudieron explorar los efectos de cambiar los principios de programación del mantenimiento de línea, lo que resultó en la propuesta de un nuevo tipo de búfer, de interés para la teoría de OM. Los principales hitos y eventos en el proceso de investigación consistieron en replantear el problema de confiabilidad de la salida como un problema de reprogramación (cambiando el enfoque del compromiso en la práctica a la exploración y el modelado del diseño) articulando la solución como un búfer de registro inicial en contraste con un retraso acumulado (cambiando el enfoque de desde el diseño y el modelado hasta la búsqueda teórica y la teorización) y los resultados de una simulación detallada que indicó el potencial para mejorar la confiabilidad de la salida y la eficiencia de costos de mantenimiento (devolviendo la atención a la implementación y superando los obstáculos para la implementación).

El compromiso de investigación con Nordic Airline comenzó en 2014 como parte de una gran iniciativa de investigación estratégica que reúne a investigadores académicos y a la industria financiada por la agencia de financiación para tecnología e innovación. La dirección de la organización de mantenimiento buscaba formas de mejorar la fiabilidad de las salidas de su flota de largo recorrido e invitó a los investigadores académicos a unirse a la búsqueda. La aerolínea opera una red de centro y radio con una ventaja geográfica en la conexión de Asia y Europa, enfatizando la importancia estratégica de la flota de largo recorrido y, por extensión, la confiabilidad de las salidas. La ventaja geográfica del centro de la aerolínea se traduce en una de las mayores utilizaciones de flota para aviones de largo recorrido, donde los aviones pasan más tiempo en el aire que en tierra. Debido a la alta utilización de la flota, la ventana de mantenimiento típica en el centro se limita a unas pocas horas por día, entre el momento en que la aeronave llega al centro y regresa a su destino asiático. La aerolínea se refiere a esto como mantenimiento de respuesta y el aumento de la flexibilidad de los recursos en esta operación fue el enfoque inicial de la investigación.

Al final del compromiso inicial en 2015, a través de la exploración de objetivos contradictorios utilizando herramientas de proceso de pensamiento (Groop et al., 2017), se identificó la posibilidad de un cambio en la programación de mantenimiento como una posible solución. La posibilidad se investigó primero en el contexto del proceso de planificación de mantenimiento de línea existente, con el propósito de reducir la variabilidad de la carga de trabajo en las operaciones de mantenimiento de respuesta. El hallazgo fue que, para la flota de largo recorrido, parte de la carga de trabajo programada podría planificarse para que luego pudiera posponerse de manera oportunista, introduciendo de hecho a propósito un exceso de mantenimiento. Desarrollar el efecto de este cambio en el costo de mantenimiento fue la tercera fase del proceso de investigación, la simulación detallada, que se inició en mayo de 2016. La cuarta etapa del proceso de investigación fue identificar cuál era esta nueva práctica de mantenimiento, desde una perspectiva teórica , y realizado para escribir este artículo de investigación, que comenzó a principios de 2017. Esta teorización consistió en contrastar nuestro diseño y nuestros hallazgos con un amplio cuerpo de literatura académica sobre operaciones y administración de mantenimiento. Actualmente, la introducción de la solución propuesta en la práctica está progresando como parte de un esfuerzo de digitalización más amplio, con la negociación en curso de un papel potencial de los investigadores en el proyecto. Los datos recopilados para la investigación a través de la participación en la práctica y para el modelado se resumen en la Tabla 2.

Descripciones del proceso de mantenimiento

Documentación de cumplimiento normativo

Informes (rendimiento de la flota, mano de obra, retrasos)

Extractos de documentos utilizados en las operaciones (hojas de planificación, instrucciones de trabajo, etc.)

Programas de mantenimiento de aeronaves

Registros de eventos de mantenimiento (12 meses)

Datos del programa de tráfico (12 meses)

Notas de discusiones informales

Debates ad hoc para aclarar problemas que surgieron durante el modelado.

Notas de reuniones y presentaciones de resultados

Comprometerse con la empresa del caso para abordar su problema de campo inicial inició un proceso de encuadre y reencuadre (Simon, 1996) que presentó una oportunidad para innovar las operaciones de mantenimiento de la línea de aeronaves. Estar atento a los marcos sostenidos por los interesados ​​en el tema (Coghlan y Brannick, 2001) crea la oportunidad de replantear los problemas de campo de formas novedosas con el propósito de un diseño exploratorio (Groop et al., 2017). La fase de modelado de la investigación estudió primero la relación entre el exceso de mantenimiento y la variación de la carga de trabajo en un entorno determinista, centrándose únicamente en el mantenimiento programado (Öhman, Laine & Holmström, 2016. Para el estudio inicial, realizamos cinco entrevistas semiestructuradas (cada una con una duración de 1 a 2 horas) con planificadores de mantenimiento para flotas de corta y larga distancia y gerentes de planificación de operaciones, producción y recursos. A través de estas entrevistas, obtuvimos una comprensión profunda de la función de planificación de mantenimiento de la empresa de casos. heurísticas y principios no visibles en la documentación operativa. El estudio mostró resultados prometedores: un aumento del 1% en la carga de trabajo total planificada podría resultar en una reducción de hasta un 6% en la variación de la carga de trabajo. Sin embargo, llegamos a la conclusión de que el impacto real no se pudo evaluar mientras que se descuidó la variabilidad natural de la demanda causada por la carga de trabajo emergente.

Through the engagement with practice and the initial modeling phase, we developed a rich, in-depth understanding of the case company context (cf. Forrester, 1992 ), based on both qualitative and quantitative data (Table 2). This understanding was crucial in empirical grounding of the simulation model presented here, and it allowed us to formulate the good problem, which is the key to success in any simulation project (Law, 2003 ). The simulation model then allowed us to explore the effect of the proposed buffer management approach in a stochastic setting.


2 respuestas 2

I agree with everything from palacsint (7. could be discussed. If it is a requirement, then it is fine)
I will add some more thoughts.

This comment is not necessary. Even more, noone (with an IDE) will read comments in the import section.

As far as I see it, your implementation is a fixed size (FIFO) queue. If I am right, I would choose this name instead of CircularBuffer .
With this name, even if it is not well defined, I would expect some circularity. There is none. (Not for the caller, the inside details are not interesting for anyone using this class.)
One could even argument, that using java collection (implement an interface, using collection classes) would be a good way to integrate it inside the java world.

I would change the names, the array is in fact the buffer , put_idx the head , get_idx the tail , count the number of elements and size is not needed:

Do you need this method? If no, remove it. If you need it, it could be a good idea to clear the buffer, too. The garbage collector would appreciate this.

A typical and good name for a method returning a method is isSomething() or hasSomething() . So in this case isEmpty() , isFull() .

If we look at java collections, the typical and expected name would bet getSize()

I would throw an IllegalStateException exception. ArrayIndexOutOfBoundsException is not true, the buffer is full, it can not be out of bounds, unless the implementation is wrong.
In this case, the expected state is "not full", but it is "full".
Remark: Depending on the requirements, you could start to overwrite old entries. This would be typical for a circular buffer.

I would add some javadoc comments, at least to tell the caller about the exception he could catch.

This comment is already clear from the method signature.
If we look at java collections again, I would rename it to addAll .
Which is quite important if you try to add for example null . Does it go to insert(T element) or insert(T[] thearray) ? Should it be there?

This could be simplified, you do not need 2 complex cases:

And because the name and argument behavior of System.arraycopy is awful, I would introduce a small method. So anyone reading it could understand it without spending time on thinking about arraycopy :

If we look at java collections again, I would rename it too removeOldest() . Or if you want to be very specific removeAndGetOldest() .
It is not the typical expectation to remove the element if get is called. If you do so, add at least some javadoc comment indicating this behavior.
Exception: See above.

This is only a personal opinion: I would avoid using the postincrement operator overall. This case looks simple, but you can easily get complicated cases because of side effects in all languages.
And with current compilers, it does (in most of the scenarios) not make any change in size, speed or whatever.
So I would go for readability.


Acknowledgements and funding

We thank Jean David, Masayoshi Watada, Ary Hoffmann and Wenxia Zhang for providing fly strains, Rudolf Saegesser and Anina Pescatore for technical assistance, and Suzannah Rutherford for discussion. AW acknowledges support through Swiss National Science Foundation grants 315200-116814, 315200-119697, and 315230-129708, as well as through the YeastX project of SystemsX.ch, and the University Priority Research Program in Systems Biology at the University of Zurich.


ArcGIS Pro: Create polygons from outlines of unclosed lines

First a disclaimer: I have very little experience with ArcGIS, I usually use QGIS and only recently started using ArcGIS Pro.

I have a River dataset from the Natural Earth Site, then made its symbology thickness vary depending on its "strokeweig" attribute.

My goal is relatively simple: Creating a polygon that follows the outlines of this river line with variable thickness.

At first i saw two main ways of doing it:

Simply creating a polygon and drawing it (using the Freehand tool) so that it follows the outline of the rivers, however this is time consuming, and the fact the size of the river change when zooming prevents accurate drawing.

Exporting the river alone as a raster, then creating a polygon out of that raster, however I would have to reasign coordinates for this new polygon, which would bring some inacuracies.

-- Most of the Internet tutorials i saw recommended using the "Construct Polygon" tool, however it doesn't work on unclosed lines, and it only creates polygons out of the few rivers that join back. (Exemple here: https://i.imgur.com/CrTByTD.png https://i.imgur.com/ipt5hK8.png )

Furthermore, someone told me to use the "Convert features into graphics" tool, then reverse it with the "Convert graphics into feature", however, these tools only seem to be available on ArcMap, and not ArcGis Pro (and if i am mistaken and they are avaible, how does one access them?).

So to recap: Is there a way to directly (as automatically as possible) create a polygon out of the shape/outlines of these river line (with their symbology) without either having to draw polygons by hand or exporting it as a Raster image.

Can you buffer the lines and use strokeweig as the buffer value to get something like this?

Yes it is possible, as someone answered on another forum, it is quite contrivied however, i copied the answer in that comment:

Use option 1, but instead of freehand use the trace tool.

Thanks, i fear that may be the only way.

Is there a way to "freeze" the size of symbols/line thickness, so that when i zoom it doesn't resizes? Because simply increasing the thickness of the line also changes the shape of the outline.

Most Some of those should be available as a polygon layer somewhere. especially the Amazon. I'm investigating the availability of something and will report back.

Although to be fair the region i was the most interested in is Subsaharian africa.

I think buffering is going to be your best bet, but to elaborate on your other ideas:

Simply creating a polygon and drawing it (using the Freehand tool) so that it follows the outline of the rivers, however this is time consuming, and the fact the size of the river change when zooming prevents accurate drawing.

You can fix the zooming issue by setting a reference scale. Like, if you've got the symbology set up so that you like how it looks and you're at 1:100,000, you can set the reference scale to 1:100,000, and then the symbology will always render as though you were at 1:100,000 -- so when you zoom in, the symbology gets really big, which would make it easier for you to digitize or freehand, and when you zoom out, it gets really small, instead of actively re-sizing like it normally does. I still wouldn't recommend doing that though, because as you noted, it would take forever.

Exporting the river alone as a raster, then creating a polygon out of that raster, however I would have to reasign coordinates for this new polygon, which would bring some inacuracies.

This is going to ignore the symbology you've set and only make a raster with a single "line" of cells in it. The symbology is based on the layer (what you see in the table of contents, which includes the symbology), but most tools run off the underlying data. Same thing applies if you made the rivers all dashed lines the program is going to convert the data and give you a solid line, rather than converting the symbology and giving you pieces of a line.

[the buffer] is quite contrivied however

Those instructions are very thorough, but I think they make it sound harder than it really is. You're already using "strokeweight" (I'm gonna roll with that as the name of the column) to vary the line weight. You need to do the same thing to run the buffer tool, but unfortunately, while you're smart enough to turn those stroke weights into something that looks good, the buffer tool is not. You have to translate those stroke weights into distances that the buffer tool needs to run its calculations.

So like, let's say your biggest rivers have a stroke weight of 7, and you've made those 5pt lines in your map. Do some measuring in your map and figure out what you think an appropriate distance would be. Maybe at the scale you're currently at, where you think it looks good, that 5pt line measures out to

20km wide. (Setting a reference scale here would help you as you measure these distances). If you want a river that's 20km wide edge to edge, you would need to buffer the line by 10km. Ok, so now you know that strokeweight 7 = 10km buffer. So add a new column (field) to your data to hold these buffer distances. For every row that has a stroke weight of 7, you're going to fill in the buffer distance with a 10. (Don't worry about the units you can set those when you run the tool). You can use the "select by attributes" tool to select all the rows with a stroke weight of 7 at once, and you can use field calculator to copy your new value of 10 into all of those selected rows at once.

Then you just repeat that for each of your stroke weights -- figure out what the buffer distance would be for each of your stroke weights, then use select by attribute and field calculator to select and fill in the appropriate buffer distance for each stroke weight.

When all of the river segments have a buffer distance calculated, you can run the buffer tool and tell it to use the buffer distance field for the buffer distances.


Resumen

Remnant urban forests are often popular sites for recreational activities such as hiking, biking and motorised recreation. This can result in the formation of extensive trail networks, fragmenting vegetation into patches separated by modified edge effects and ultimately contributing to the degradation of the ecosystem as a whole. Here we use a GIS approach to assess the extent and diversity of trail-based fragmentation across 17 remnants of endangered urban forest (total area 829 ha, Tall Open Blackbutt Forest) in southeast Queensland, Australia. Fourteen different trail types totalling 46.1 km were mapped with informal biking and hiking trails the most common (57%, 26.5 km). More than 47 ha (5.7%) of forest have been lost to trails and their edge effect, nearly equal to the area recently cleared for urban development. The degree of fragmentation in some remnants was in the same order of magnitude as found for some of the most popular nature-based recreation sites in the world. In localised areas, the fragmentation was particularly severe as a result of wide trails used by motorised recreation, but these trails were generally uncommon across the landscape (5%). Spatial regression revealed that the number of access points per remnant was positively correlated with the degree of fragmentation. We encourage more landscape-scale research into trail-based fragmentation due to its capacity to impact extensive areas of endangered ecosystems. Management should seek to minimise the creation of informal trails by hardening popular routes, instigating stakeholder collaboration and centralising visitor flow.


I ended up using bytearray as an input and output buffer. If found that if the output was something that doesn't buffer output (like a socket), then writing 77 bytes at a time would be very slow. Also my original code rounded the read size to be advantageous for base64, but not advantageous for MongoDB. It's better for the read size to match the MongoDB chunk size exactly. So the input is read into a bytearray with the exact size passed in, but then read in smaller base64 size chunks.

For 10 iterations of a 10 MB file (complete test), this version is up to 5 times faster than standard base64 with large buffer sizes (>969) when reading a file without buffering (like a socket). For small buffer sizes (

100) it is about the same or worse than standard base64.

The first thing I notice is that you are using Python2. This is almost certainly wrong. Python3 is faster for most applications, and Python2 is going EOL in 15 months.

Other than that, my main comments would be that this would probably benefit from async as this is an IO heavy function, so you could be doing the computation while waiting for a different IO task to finish.


Ver el vídeo: ArcGIS. Create a Buffer around a Point in ArcMap