Ubuntu에서 천만 점 산점도 벤치 마크를 사용하는 오픈 소스 대화 형 플로팅 소프트웨어 설문 조사
: 사용 사례에서 영감은 설명 /stats/376361/how-to-find-the-sample-points-that-have-statistically-meaningful-large-outlier-r 내가 벤치마킹 한 다음과 같은 매우 간단하고 순진한 천만 점의 직선 데이터로 몇 가지 구현 :
i=0;
while [ "$i" -lt 10000000 ]; do
echo "$i,$((2 * i)),$((4 * i))"; i=$((i + 1));
done > 10m.csv
처음 몇 줄은 10m.csv
다음과 같습니다.
0,0,0
1,2,4
2,4,8
3,6,12
4,8,16
기본적으로 다음을 원했습니다.
- Z를 포인트 색상으로 사용하여 다차원 데이터의 XY 산점도를 수행하십시오.
- 몇 가지 흥미로운 점을 대화식으로 선택
- 선택한 포인트 (적어도 X, Y 및 Z 포함)의 모든 차원을보고 XY 산포에서 특이 치인 이유를 이해합니다.
재미를 더하기 위해 프로그램이 천만 포인트를 처리 할 수있는 경우를 대비하여 더 큰 10 억 포인트 데이터 세트도 준비했습니다! CSV 파일이 약간 불안정 해져서 HDF5로 옮겼습니다.
import h5py
import numpy
size = 1000000000
with h5py.File('1b.hdf5', 'w') as f:
x = numpy.arange(size + 1)
x[size] = size / 2
f.create_dataset('x', data=x, dtype='int64')
y = numpy.arange(size + 1) * 2
y[size] = 3 * size / 2
f.create_dataset('y', data=y, dtype='int64')
z = numpy.arange(size + 1) * 4
z[size] = -1
f.create_dataset('z', data=z, dtype='int64')
다음을 포함하는 ~ 23GiB 파일이 생성됩니다.
- 직선으로 10 억 점
10m.csv
- 그래프의 중앙 상단에 하나의 특이점
테스트는 하위 섹션에서 달리 언급하지 않는 한 Ubuntu 18.10에서 수행되었으며 Intel Core i7-7820HQ CPU (4 코어 / 8 스레드), 2x Samsung M471A2K43BB1-CRC RAM (2x 16GiB), NVIDIA Quadro M1200이 장착 된 ThinkPad P51 노트북에서 수행되었습니다. 4GB GDDR5 GPU.
결과 요약
이것은 저의 매우 구체적인 테스트 사용 사례를 고려할 때 제가 관찰 한 내용이며 검토 된 많은 소프트웨어를 처음 사용하는 사람입니다.
천만 포인트를 처리합니까?
Vaex Yes, tested up to 1 Billion!
VisIt Yes, but not 100m
Paraview Barely
Mayavi Yes
gnuplot Barely on non-interactive mode.
matplotlib No
Bokeh No, up to 1m
PyViz ?
seaborn ?
많은 기능이 있습니까?
Vaex Yes.
VisIt Yes, 2D and 3D, focus on interactive.
Paraview Same as above, a bit less 2D features maybe.
Mayavi 3D only, good interactive and scripting support, but more limited features.
gnuplot Lots of features, but limited in interactive mode.
matplotlib Same as above.
Bokeh Yes, easy to script.
PyViz ?
seaborn ?
GUI가 기분이 좋습니까 (좋은 성능을 고려하지 않음) :
Vaex Yes, Jupyter widget
VisIt No
Paraview Very
Mayavi OK
gnuplot OK
matplotlib OK
Bokeh Very, Jupyter widget
PyViz ?
seaborn ?
Vaex 2.0.2
https://github.com/vaexio/vaex
설치하고 다음과 같이 작동하는 hello world를 얻으십시오. Vaex에서 대화식 2D 산점도 줌 / 포인트 선택을 수행하는 방법은 무엇입니까?
나는 최대 10 억 포인트로 vaex를 테스트했고 효과가 있었다.
재현성이 뛰어나고 다른 Python 것들과 쉽게 인터페이스 할 수있는 "Python-scripted-first"입니다.
Jupyter 설정에는 몇 가지 움직이는 부분이 있지만 일단 virtualenv로 실행하면 놀랍습니다.
Jupyter에서 실행 된 CSV를로드하려면 :
import vaex
df = vaex.from_csv('10m.csv', names=['x', 'y', 'z'],)
df.plot_widget(df.x, df.y, backend='bqplot')
그리고 우리는 즉시 볼 수 있습니다.
이제 마우스로 포인트를 확대 / 축소, 이동 및 선택할 수 있으며 업데이트가 정말 빠릅니다. 모두 10 초 이내에 완료됩니다. 여기에서는 일부 개별 포인트를보기 위해 확대하고 그중 몇 개를 선택했습니다 (이미지에서 희미한 밝은 사각형).
마우스로 선택한 후에는 df.select()
방법 을 사용하는 것과 똑같은 효과가 있습니다. 따라서 Jupyter에서 실행하여 선택한 점을 추출 할 수 있습니다.
df.to_pandas_df(selection=True)
다음 형식으로 데이터를 출력합니다.
x y z index
0 4525460 9050920 18101840 4525460
1 4525461 9050922 18101844 4525461
2 4525462 9050924 18101848 4525462
3 4525463 9050926 18101852 4525463
4 4525464 9050928 18101856 4525464
5 4525465 9050930 18101860 4525465
6 4525466 9050932 18101864 4525466
10M 포인트가 잘 작동했기 때문에 1B 포인트를 시도하기로 결정했습니다 ... 그리고 잘 작동했습니다!
import vaex
df = vaex.open('1b.hdf5')
df.plot_widget(df.x, df.y, backend='bqplot')
원래 플롯에서 보이지 않았던 이상 치를 관찰하기 위해 vaex 대화 형 Jupyter bqplot plot_widget에서 포인트 스타일을 어떻게 변경하여 개별 포인트를 더 크고 보이게 만들 수 있습니까? 사용 :
df.plot_widget(df.x, df.y, f='log', shape=128, backend='bqplot')
다음을 생성합니다.
포인트를 선택한 후 :
이상치의 전체 데이터를 얻습니다.
x y z
0 500000000 1500000000 -1
다음은 더 흥미로운 데이터 세트와 더 많은 기능을 가진 제작자의 데모입니다. https://www.youtube.com/watch?v=2Tt0i823-ec&t=770
Ubuntu 19.04에서 테스트되었습니다.
VisIt 2.13.3
웹 사이트 : https://wci.llnl.gov/simulation/computer-codes/visit
라이센스 : BSD
National Nuclear Security Administration 인 Lawrence Livermore National Laboratory 에서 개발 연구소 인 했으므로 제가 작동하게된다면 10m 포인트가 아무 소용이 없을 것이라고 상상할 수 있습니다.
설치 : 데비안 패키지가 없습니다. 웹 사이트에서 Linux 바이너리를 다운로드하세요. 설치하지 않고 실행됩니다. 참조 : /ubuntu/966901/installing-visit
많은 고성능 그래프 소프트웨어가 사용하는 백엔드 라이브러리 인 VTK 를 기반으로 합니다. C로 작성.
UI로 3 시간을 플레이 한 후 작동하게되었고 /stats/376361/how-to-find-the-sample-에 자세히 설명 된대로 제 사용 사례를 해결했습니다. 통계적으로 의미있는 점이 큰 이상치 r
이 게시물의 테스트 데이터는 다음과 같습니다.
몇 가지 선택 사항이있는 확대 / 축소 :
다음은 추천 창입니다.
성능면에서 VisIt은 매우 좋았습니다. 모든 그래픽 작업은 시간이 조금 걸리거나 즉각적이었습니다. 기다려야 할 때 남은 작업 비율과 함께 "처리 중"메시지가 표시되고 GUI가 정지되지 않았습니다.
10m 포인트가 너무 잘 작동했기 때문에 100m 포인트 (2.7G CSV 파일)도 시도했지만 충돌이 발생하거나 안타깝게도 이상한 상태가되었습니다. htop
되었고 4 개의 VisIt 스레드가 내 16GiB RAM을 모두 차지하여 사망했을 가능성이 높습니다. 실패한 malloc에.
처음 시작하는 것은 약간 고통 스러웠습니다.
- 당신이 핵폭탄 엔지니어가 아니라면 많은 디폴트가 끔찍하다고 느낍니까? 예 :
- 기능이 많기 때문에 원하는 것을 찾기가 어려울 수 있습니다.
- 설명서는 매우 도움이
되었지만 "2005 년 10 월 버전 1.5"라는 불길한 날짜의 386 페이지 PDF입니다. 나는 그들이 삼위 일체 를 개발하기 위해 이것을 사용했는지 궁금합니다 ! 그리고 그것은이다 좋은 스핑크스 HTML은 내가 처음이 질문에 대답 한 후 방금 만든이
- Ubuntu 패키지가 없습니다. 그러나 미리 빌드 된 바이너리는 제대로 작동했습니다.
나는 이러한 문제를 다음과 같이 돌린다.
- 오랫동안 사용되어 왔으며 구식 GUI 아이디어를 사용합니다.
- 플롯 요소를 클릭하여 변경 (예 : 축, 제목 등) 할 수 없으며 많은 기능이 있으므로 원하는 것을 찾기가 약간 어렵습니다.
나는 또한 약간의 LLNL 인프라가 해당 저장소로 누출되는 방식을 좋아합니다. 예를 들어 docs / OfficeHours.txt 및 해당 디렉토리의 다른 파일을 참조하십시오 ! "월요일 아침 남자"브래드에게 미안 해요! 아, 그리고 자동 응답기의 비밀번호는 "Kill Ed"입니다. 잊지 마세요.
Paraview 5.4.1
웹 사이트 : https://www.paraview.org/
라이센스 : BSD
설치:
sudo apt-get install paraview
개발사 또 다른 NNSA 연구소 인 Sandia National Laboratories에서 했으므로 데이터를 쉽게 처리 할 수있을 것으로 기대합니다. 또한 VTK 기반이며 C ++로 작성되었는데, 이는 더욱 유망했습니다.
그러나 나는 실망했다. 어떤 이유에서인지 10m 포인트로 인해 GUI가 매우 느리고 반응이 없었다.
"지금 작업 중입니다. 잠시만 기다려주십시오."라는 광고가 잘 나오면 괜찮습니다.하지만 그 동안 GUI가 멈추나요? 허용하지 않는다.
htop은 Paraview가 4 개의 스레드를 사용하고 있지만 CPU와 메모리가 모두 최대 값을 초과하지 않음을 보여주었습니다.
GUI 측면에서 Paraview는 더듬 거리지 않을 때 VisIt보다 훨씬 훌륭하고 현대적입니다. 여기에 참고 용으로 더 낮은 점수가 있습니다.
다음은 수동 포인트 선택이 포함 된 스프레드 시트보기입니다.
또 다른 단점은 Paraview가 VisIt에 비해 기능이 부족하다고 느꼈다는 것입니다. 예 :
Mayavi 4.6.2
웹 사이트 : https://github.com/enthought/mayavi
개발자 : Enthought
설치:
sudo apt-get install libvtk6-dev
python3 -m pip install -u mayavi PyQt5
VTK Python 하나.
Mayavi는 3D에 매우 중점을 두는 것처럼 보이며 2D 플롯을 수행하는 방법을 찾을 수 없었으므로 불행히도 사용 사례에 적합하지 않습니다.
그러나 성능을 확인하기 위해 https://docs.enthought.com/mayavi/mayavi/auto/example_scatter_plot.html 의 예제 를 1,000 만 포인트에 적용했으며 지연없이 잘 실행됩니다.
import numpy as np
from tvtk.api import tvtk
from mayavi.scripts import mayavi2
n = 10000000
pd = tvtk.PolyData()
pd.points = np.linspace((1,1,1),(n,n,n),n)
pd.verts = np.arange(n).reshape((-1, 1))
pd.point_data.scalars = np.arange(n)
@mayavi2.standalone
def main():
from mayavi.sources.vtk_data_source import VTKDataSource
from mayavi.modules.outline import Outline
from mayavi.modules.surface import Surface
mayavi.new_scene()
d = VTKDataSource()
d.data = pd
mayavi.add_source(d)
mayavi.add_module(Outline())
s = Surface()
mayavi.add_module(s)
s.actor.property.trait_set(representation='p', point_size=1)
main()
산출:
그러나 개별 지점을 볼 수있을만큼 확대 할 수 없었고 가까운 3D 평면이 너무 멀었습니다. 방법이 있을까요?
Mayavi의 멋진 점 중 하나는 개발자가 Matplotlib 및 gnuplot과 마찬가지로 Python 스크립트에서 GUI를 멋지게 실행하고 설정할 수 있도록 많은 노력을 기울 였다는 것입니다. Paraview에서도 가능한 것 같지만 문서는 적어도 좋지 않습니다.
일반적으로 VisIt / Paraview만큼 기능이 충분하지 않습니다. 예를 들어 GUI에서 CSV를 직접로드 할 수 없습니다 . Mayavi GUI에서 CSV 파일을로드하는 방법은 무엇입니까?
Gnuplot 5.2.2
웹 사이트 : http://www.gnuplot.info/
gnuplot은 빠르고 더러워 질 필요가있을 때 정말 편리하며 항상 가장 먼저 시도합니다.
설치:
sudo apt-get install gnuplot
비대화 형 사용의 경우 10m 포인트를 합리적으로 잘 처리 할 수 있습니다.
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10m1.csv" using 1:2:3:3 with labels point
7 초 만에 완료되었습니다.
하지만 상호 작용을하려고하면
set terminal wxt size 1024,1024
set key off
set datafile separator ","
plot "10m.csv" using 1:2:3 palette
과:
gnuplot -persist main.gnuplot
그러면 초기 렌더링 및 확대 / 축소가 너무 느리게 느껴집니다. 사각형 선택 선도 안보여요!
또한 내 사용 사례에서는 다음과 같이 하이퍼 텍스트 레이블을 사용해야했습니다.
plot "10m.csv" using 1:2:3 with labels hypertext
그러나 비대화 형 렌더링을 포함하여 레이블 기능에 성능 버그가있었습니다. 하지만보고했고 Ethan은 하루 만에 해결했습니다. https://groups.google.com/forum/#!topic/comp.graphics.apps.gnuplot/qpL8aJIi9ZE
그러나 이상치 선택에 대한 합리적인 해결 방법이 하나 있다고 말해야합니다. 행 ID가있는 레이블을 모든 포인트에 추가하기 만하면됩니다! 근처에 많은 포인트가 있으면 라벨을 읽을 수 없습니다. 그러나 당신이 신경 쓰는 이상치에 대해서는 그럴 수도 있습니다! 예를 들어 원래 데이터에 특이 치를 하나 추가하면 다음과 같습니다.
cp 10m.csv 10m1.csv
printf '2500000,10000000,40000000\n' >> 10m1.csv
플롯 명령을 다음과 같이 수정하십시오.
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10.csv" using 1:2:3:3 palette with labels
이로 인해 플로팅 속도가 크게 느려지지만 (위에서 언급 한 수정 후 40 분) 합리적인 출력이 생성됩니다.
따라서 데이터 필터링을 통해 결국 도달하게됩니다.
Matplotlib 1.5.1, numpy 1.11.1, Python 3.6.7
웹 사이트 : https://matplotlib.org/
Matplotlib는 gnuplot 스크립트가 너무 미치기 시작할 때 일반적으로 시도하는 것입니다.
numpy.loadtxt
혼자서 약 10 초가 걸렸기 때문에 이것이 잘되지 않을 것이라는 것을 알았습니다.
import numpy
import matplotlib.pyplot as plt
x, y, z = numpy.loadtxt('10m.csv', delimiter=',', unpack=True)
plt.figure(figsize=(8, 8), dpi=128)
plt.scatter(x, y, c=z)
plt.show()
먼저 비대화 형 시도에서 좋은 결과를 얻었지만 3 분 55 초가 걸렸습니다 ...
그런 다음 대화 형 작업은 초기 렌더링 및 확대 / 축소에 오랜 시간이 걸렸습니다. 사용할 수 없음 :
이 스크린 샷에서 확대 / 축소가 계산되기를 기다리는 동안 즉시 확대 / 축소되고 사라져야하는 확대 / 축소 선택이 화면에 얼마나 오랫동안 남아 있는지 확인하십시오!
plt.figure(figsize=(8, 8), dpi=128)
어떤 이유로 든 인터랙티브 버전이 작동 하려면 주석을 달아야했습니다. 그렇지 않으면 다음과 같이 폭발했습니다.
RuntimeError: In set_size: Could not set the fontsize
보케 1.3.1
https://github.com/bokeh/bokeh
Ubuntu 19.04 설치 :
python3 -m pip install bokeh
그런 다음 Jupyter를 시작합니다.
jupyter notebook
이제 1m 지점을 플로팅하면 모든 것이 완벽하게 작동하고 확대 / 축소 및 호버 정보를 포함하여 인터페이스가 훌륭하고 빠릅니다.
from bokeh.io import output_notebook, show
from bokeh.models import HoverTool
from bokeh.transform import linear_cmap
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
import numpy as np
N = 1000000
source = ColumnDataSource(data=dict(
x=np.random.random(size=N) * N,
y=np.random.random(size=N) * N,
z=np.random.random(size=N)
))
hover = HoverTool(tooltips=[("z", "@z")])
p = figure()
p.add_tools(hover)
p.circle(
'x',
'y',
source=source,
color=linear_cmap('z', 'Viridis256', 0, 1.0),
size=5
)
show(p)
초기보기 :
확대 후 :
질식하더라도 최대 10m까지 올라가면 htop
크롬에 무정전 IO 상태에서 모든 메모리를 차지하는 8 개의 스레드가 있음을 보여줍니다.
포인트 참조에 대해 묻습니다. 선택한 보케 데이터 포인트를 참조하는 방법
PyViz
https://pyviz.org/
TODO 평가.
Bokeh + datashader + 기타 도구를 통합합니다.
1B 데이터 포인트 데모 비디오 : https://www.youtube.com/watch?v=k27MJJLJNT4 "PyViz :"Anaconda, Inc. "의"PyViz : 30 줄의 Python에 10 억 개의 데이터 포인트 를 시각화하기위한 대시 보드 " 게시일 : 2018-04-17.
Seaborn
https://seaborn.pydata.org/
TODO 평가.
seaborn을 사용하여 최소 5 천만 개의 행을 시각화하는 방법에 대한 QA가 이미 있습니다 .