>

여기에 RAM에 문제가 있습니다. 플롯하려는 데이터를 보유 할 수 없습니다. 충분한 HD 공간이 있습니다. 내 데이터 세트의 "그림자"를 피하는 솔루션이 있습니까?

정확하게 나는 디지털 신호 처리를 다루고 있으며 높은 샘플링 속도를 사용해야합니다. 내 프레임 워크 (GNU Radio)는 너무 많은 디스크 공간을 사용하지 않기 위해 값을 이진으로 저장합니다. 포장을 풉니 다. 나중에 나는 음모를 꾸밀 필요가있다. 플롯 확대/축소 가능하고 대화식이 필요합니다. 그리고 그것은 문제입니다.

이것 또는 더 큰 데이터 세트를 처리 할 수있는 다른 소프트웨어/프로그래밍 언어 (R과 같은)에 대한 최적화 가능성이 있습니까? 실제로 나는 플롯에 더 많은 데이터를 원합니다. 그러나 다른 소프트웨어에 대한 경험이 없습니다. 다음과 비슷한 접근 방식으로 GNUplot이 실패합니다. 나는 R (제트)을 모른다.

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import struct
"""
plots a cfile
cfile - IEEE single-precision (4-byte) floats, IQ pairs, binary
txt - index,in-phase,quadrature in plaintext
note: directly plotting with numpy results into shadowed functions
"""
# unpacking the cfile dataset
def unpack_set(input_filename, output_filename):
    index = 0   # index of the samples
    output_filename = open(output_filename, 'wb')
    with open(input_filename, "rb") as f:
        byte = f.read(4)    # read 1. column of the vector
        while byte != "":
        # stored Bit Values
            floati = struct.unpack('f', byte)   # write value of 1. column to a variable
            byte = f.read(4)            # read 2. column of the vector
            floatq = struct.unpack('f', byte)   # write value of 2. column to a variable
            byte = f.read(4)            # next row of the vector and read 1. column
            # delimeter format for matplotlib 
            lines = ["%d," % index, format(floati), ",",  format(floatq), "\n"]
            output_filename.writelines(lines)
            index = index + 1
    output_filename.close
    return output_filename.name
# reformats output (precision configuration here)
def format(value):
    return "%.8f" % value            
# start
def main():
    # specify path
    unpacked_file = unpack_set("test01.cfile", "test01.txt")
    # pass file reference to matplotlib
    fname = str(unpacked_file)
    plt.plotfile(fname, cols=(0,1)) # index vs. in-phase
    # optional
    # plt.axes([0, 0.5, 0, 100000]) # for 100k samples
    plt.grid(True)
    plt.title("Signal-Diagram")
    plt.xlabel("Sample")
    plt.ylabel("In-Phase")
    plt.show();
if __name__ == "__main__":
    main()

plt.swap_on_disk ()와 같은 일이 내 SSD에 물건을 캐시 할 수 있습니다.)


  • 답변 # 1

    따라서 데이터가 그렇게 크지 않으며 데이터를 작성하는 데 문제가 있다는 사실은 도구의 문제를 나타냅니다. Matplotlib ....은 좋지 않습니다. 많은 옵션이 있으며 출력은 좋지만 거대한 메모리 호그이며 기본적으로 데이터가 작다고 가정합니다. 하지만 다른 옵션이 있습니다.

    예를 들어, 다음을 사용하여 20M 데이터 포인트 파일 'bigdata.bin'을 생성했습니다.

    #!/usr/bin/env python
    import numpy
    import scipy.io.numpyio
    npts=20000000
    filename='bigdata.bin'
    def main():
        data = (numpy.random.uniform(0,1,(npts,3))).astype(numpy.float32)
        data[:,2] = 0.1*data[:,2]+numpy.exp(-((data[:,1]-0.5)**2.)/(0.25**2))
        fd = open(filename,'wb')
        scipy.io.numpyio.fwrite(fd,data.size,data)
        fd.close()
    if __name__ == "__main__":
        main()
    
    

    이것은 ~ 229MB 크기의 파일을 생성합니다. 그러나 더 큰 파일로 가고 싶다고 말했기 때문에 결국 메모리 제한에 도달하게됩니다.

    비 대화식 플롯에 먼저 집중하자. 가장 먼저 알아야 할 점은 각 점에 글리프가있는 벡터 플롯이 재앙이 될 것입니다 .20 M 점 각각에 대해 대부분 겹치거나 작은 십자가 또는 원을 렌더링하려고 시도합니다. 거대한 파일을 생성하고 많은 시간이 걸리는 수고가 될 것입니다. 이것이 기본적으로 matplotlib을 싱크하는 것입니다.

    Gnuplot은 이것을 다루는데 어려움이 없습니다 :

    gnuplot> set term png
    gnuplot> set output 'foo.png'
    gnuplot> plot 'bigdata.bin' binary format="%3float32" using 2:3 with dots
    
    

    그리고 Matplotlib조차도 약간의주의를 기울여 행동 할 수 있습니다 (래스터 백엔드 선택 및 픽셀을 사용하여 점 표시) :

    #!/usr/bin/env python
    import numpy
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    datatype=[('index',numpy.float32), ('floati',numpy.float32), 
            ('floatq',numpy.float32)]
    filename='bigdata.bin'
    def main():
        data = numpy.memmap(filename, datatype, 'r') 
        plt.plot(data['floati'],data['floatq'],'r,')
        plt.grid(True)
        plt.title("Signal-Diagram")
        plt.xlabel("Sample")
        plt.ylabel("In-Phase")
        plt.savefig('foo2.png')
    if __name__ == "__main__":
        main() 
    
    

    이제 대화식을 원한다면 데이터를 비우고 플롯하고 확대해야합니다. 나는 당신이 이것을 불쾌하게하는 데 도움이되는 파이썬 도구를 모른다.

    반면에, 큰 데이터 플로팅은 매우 일반적인 작업이며 작업에 적합한 도구가 있습니다. Paraview는 저의 개인적인 취향이며 VisIt은 또 다른 하나입니다. 둘 다 주로 3D 데이터 용이지만 Paraview는 특히 2d도 수행하며 대화 형이며 Python 스크립팅 인터페이스도 있습니다. 유일한 트릭은 Paraview가 쉽게 읽을 수있는 파일 형식으로 데이터를 쓰는 것입니다.

  • 답변 # 2

    파일의 읽기를 확실히 최적화 할 수 있습니다. NumPy 배열로 직접 읽을 수 있습니다. NumPy의 원시 속도를 활용하십시오. 몇 가지 옵션이 있습니다. RAM이 문제인 경우 memmap을 사용하면 대부분의 파일을 RAM 대신 디스크에 보관할 수 있습니다.

    # Each data point is a sequence of three 32-bit floats:
    data = np.memmap(filename, mode='r', dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')])
    
    

    RAM이 문제가되지 않으면 fromfile을 사용하여 전체 배열을 RAM에 넣을 수 있습니다 :

    data = np.fromfile(filename, dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')])
    
    
    그런 다음 Matplotlib의 일반적인 plot(*data) 를 사용하여 플로팅을 수행 할 수 있습니다.  기능은 아마도 다른 솔루션에서 제안 된 "확대"방법을 통해 가능할 것입니다.

  • 답변 # 3

    보다 최근의 프로젝트는 큰 데이터 세트를위한 강력한 잠재력을 가지고 있습니다 : Bokeh는 정확히 이것을 염두에두고 만들어졌습니다.

    실제로, 플롯의 스케일과 관련된 데이터 만 디스플레이 백엔드로 전송됩니다. 이 접근 방식은 Matplotlib 접근 방식보다 훨씬 빠릅니다.

  • 답변 # 4

    조금 복잡한 것을 제안하지만 작동해야합니다. 다른 범위에서 다른 해상도로 그래프를 작성하십시오.

    예를 들어 Google 어스를 생각해보십시오. 지구 전체를 포괄하기 위해 최대 레벨에서 확대를 해제하면 해상도가 가장 낮습니다. 확대/축소하면 사진이 더 자세히 표시되지만 확대/축소중인 지역에서만 변경됩니다.

    그래서 기본적으로 (2D? 3D? 2D라고 가정하겠습니다.) 낮은 해상도로 전체 [0, n] 범위를 포괄하는 큰 그래프 하나, 작은 그래프 2 개 [ 0, n/2] 및 [n/2 + 1, n]은 큰 것의 두 배 해상도, [0, n/4] ... [3 * n/4 + 1, n을 포함하는 4 개의 작은 그래프 ] 위의 2 해상도의 두 배 등으로 설정합니다.

    내 설명이 정말 명확하지 않다. 또한, 이러한 종류의 다중 해상도 그래프가 기존 플롯 프로그램에서 처리되는지 여부를 모르겠습니다.

  • 답변 # 5

    천만 포인트 산점도 벤치 마크를 사용하는 오픈 소스 대화식 플로팅 소프트웨어 설문 조사 Ubuntu 18.10에서

    https://stats.stackexchange.com/questions/376361/how-to-find-the-sample-points-that-have-statistically-meaningful-large-outlier-r에 설명 된 사용 사례에서 영감을 얻었습니다. 다음과 같이 매우 간단하고 순진한 1 천만 포인트 직선 데이터를 사용하여 몇 가지 구현을 벤치마킹했습니다.

    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 산점도를 작성하십시오

    대화식으로 흥미로운 포인트를 선택

    선택한 점의 모든 치수를보고 XY 산포에서 왜 특이점을 찾는 지 이해합니다

    테스트는 Intel Core i7-7820HQ CPU (4 코어/8 스레드), 2x Samsung M471A2K43BB1-CRC RAM (2x 16GiB), NVIDIA Quadro M1200 4GB GDDR5 GPU가 장착 된 ThinkPad P51 랩톱에서 Ubuntu 18.10에서 수행되었습니다.

    결과 요약

    이것은 매우 구체적인 테스트 사용 사례를 고려하여 내가 관찰 한 것이며, 많은 검토 된 소프트웨어를 처음 사용하는 사용자입니다.

    천만 포인트를 처리합니까 :

    VisIt       Yes
    Paraview    Barely
    Mayavi      Yes
    gnuplot     Barely on non-interactive mode.
    matplotlib  No
    
    

    많은 기능이 있습니까 :

    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.
    
    

    GUI가 기분 좋습니까 (성능이 좋지 않은 경우) :

    VisIt       No
    Paraview    Very
    Mayavi      OK
    gnuplot     OK
    matplotlib  OK
    
    

    VisIt 2.13.3

    웹 사이트 : https://wci.llnl.gov/simulation/computer-codes/visit

    라이센스 : BSD

    국가 원자력 안보국 연구소 인 Lawrence Livermore National Laboratory에 의해 개발되었으므로 10m 포인트 만 있으면 아무 효과가 없을 것입니다.

    설치 : 데비안 패키지는 없습니다. 웹 사이트에서 Linux 바이너리를 다운로드하십시오. 설치하지 않고 실행합니다. 참조 : https://askubuntu.com/questions/966901/installing-visit

    고성능 그래프 소프트웨어가 많이 사용하는 백엔드 라이브러리 인 VTK를 기반으로합니다. C로 작성 됨

    UI로 3 시간 동안 플레이 한 후에는 작동하게되었고 https://stats.stackexchange.com/questions/376361/how-to-find-the에서 자세히 설명 된대로 사용 사례를 해결했습니다. -sample-points-that-statstically-meaningful-large-outlier-r

    이 게시물의 테스트 데이터는 다음과 같습니다.

    선택과 줌 :

    여기 추천 창이 있습니다 :

    성능 현명한, Vis 매우 훌륭했습니다. 모든 그래픽 작업은 시간이 거의 걸리지 않았거나 즉각적이었으며 훨씬 더 많은 데이터를 쉽게 처리 할 수 ​​있다고 생각합니다. 기다려야 할 때 남은 작업 비율과 함께 "처리 중"메시지가 표시되고 GUI가 중지되지 않았습니다.

    10m 포인트가 잘 작동했기 때문에 100m 포인트 (2.7G CSV 파일)도 시도했지만 불행히도 충돌/이상한 상태가되었습니다 . htop 에서 보았습니다.  4 개의 VisIt 스레드가 내 16GiB RAM을 모두 차지하고 malloc이 실패하여 사망했을 가능성이 있습니다.

    초기 시작은 약간 고통 스러웠습니다 :

    당신이 핵폭탄 기술자가 아니라면 많은 불이행이 무섭게 느껴지나요? 예 :

    기본 포인트 크기 1px (모니터의 먼지와 혼동 됨)

    축은 0.0에서 1.0 사이로 스케일링 : 방문 플로팅 프로그램에서 0.0에서 1.0의 분수 대신 실제 축 번호 값을 표시하는 방법?

    멀티 창 설정, 데이터 포인트를 선택할 때 불쾌한 멀티 팝업

    사용자 이름과 플롯 날짜를 표시합니다 ( "컨트롤">"주석">"사용자 정보"로 제거)

    자동 위치 지정 기본값이 잘못됨 : 축과의 범례 충돌, 제목 자동화를 찾을 수 없으므로 레이블을 추가하고 모든 것을 수동으로 재배치해야 함

    단지 많은 기능이 있으므로 원하는 것을 찾기가 어려울 수 있습니다

    이 설명서는 매우 도움이되었지만 "2005 년 10 월 버전 1.5"로 불명확하게 작성된 386 페이지의 맘모스입니다. 그들이 Trinity를 개발하기 위해 이것을 사용했는지 궁금합니다!그리고 이것이 원래이 질문에 대답 한 직후에 만들어진 멋진 Sphinx HTML입니다

    우분투 패키지가 없습니다. 하지만 미리 만들어진 바이너리는 작동했습니다.

    이 문제의 원인은 다음과 같습니다.

    오랜 시간이 오래되어 구식 GUI 아이디어를 사용합니다

    플롯 요소를 클릭하여 변경할 수는 없습니다 (예 : 축, 제목 등). 많은 기능이 있으므로 원하는 것을 찾기가 조금 어렵습니다

    또한 일부 LLNL 인프라가 해당 리포지토리로 유출되는 것을 좋아합니다. 해당 디렉토리의 docs/OfficeHours.txt 및 기타 파일을 참조하십시오! "Monday Morning guy"인 Brad에게 미안합니다! 아, 그리고 자동 응답기의 암호는 "Kill Ed"입니다. 잊지 마십시오.

    Paraview 5.4.1

    웹 사이트 : https://www.paraview.org/

    라이센스 : BSD

    설치 :

    sudo apt-get install paraview
    
    

    또 다른 NNSA 연구소 인 Sandia National Laboratories에서 개발 했으므로 데이터를 쉽게 처리 할 수있을 것으로 기대합니다. 또한 VTK 기반이며 C ++로 작성되었으며, 이는 더욱 확실해졌습니다.

    내가 실망한 이유 : 어떤 이유로 든 10m 포인트로 인해 GUI가 매우 느리고 응답하지 않았습니다.

    저는 "지금 일하고 있습니다, 조금만 기다리세요"라는 순간에 잘 통제 된 광고를했는데 괜찮습니다. 허용되지 않습니다.

    htop은 Paraview가 4 개의 스레드를 사용하고 있지만 CPU 나 메모리가 최대로 사용되지 않았 음을 보여주었습니다.

    GUI면에서, Paraview는 매우 멋지고 현대적이며, 말더듬이되지 않을 때 VisIt보다 훨씬 좋습니다. 여기에 참조 할 수있는 점수가 더 낮습니다.

    다음은 수동 포인트 선택이있는 스프레드 시트보기입니다 :

    또 다른 단점은 Paraview가 VisIt에 비해 기능이 부족하다고 느꼈다는 것입니다. 예 :

    세번째 열을 기준으로 산포의 색상을 설정하는 방법을 찾을 수 없습니다 : gnuplot 팔레트와 같은 Paraview에서 세 번째 열의 값으로 플롯 포인트의 색상을 지정하는 방법

    마커 크기를 조정할 수 없습니다 !!! https://gitlab.kitware.com/paraview/paraview/issues/14169

    Mayavi 4.6.2

    웹 사이트 : https://github.com/enthought/mayavi

    개발자 : 열광적 인

    설치 :

    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의 예제를 천만 포인트로 조정했으며 지연없이 잘 작동합니다.

    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 파일을로드하는 방법?

    그노 플롯

    웹 사이트 : http://www.gnuplot.info/

    gnuplot은 빠르고 더러워 야 할 때 정말 편리하며 항상 시도하는 것이 가장 좋습니다.

    설치 :

    sudo apt-get install gnuplot
    
    

    비 대화식 사용의 경우 10m 포인트를 합리적으로 잘 처리 할 수 ​​있습니다.

    #!/usr/bin/env gnuplot
    set terminal png size 1024,1024
    set output "gnuplot.png"
    set key off
    set datafile separator ","
    plot "10m.csv" using 1:2:3 palette
    
    

    7 초 만에 완료 :

    하지만 대화식으로 가려고하면

    #!/usr/bin/env gnuplot
    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

    Matplotlib 1.5.1, numpy 1.11.1, Python 3.6.7

    웹 사이트 : https://matplotlib.org/

    Matplotlib는 gnuplot 스크립트가 너무 미쳐지기 시작할 때 일반적으로 시도하는 것입니다.

    numpy.loadtxt  혼자서 약 10 초가 걸렸으므로 이것이 잘 진행되지 않을 것이라는 것을 알았습니다.

    #!/usr/bin/env python3
    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)
    # Non-interactive.
    #plt.savefig('matplotlib.png')
    # Interactive.
    plt.show()
    
    

    비 대화식 시도는 좋은 결과를 얻었지만 3 분 55 초가 걸렸습니다 ...

    그러면 대화식 이미지는 초기 렌더링 및 확대/축소에 오랜 시간이 걸렸습니다. 사용할 수 없음 :

    이 스크린 샷에서 확대/축소가 계산되기를 기다리는 동안 화면에서 즉시 확대/축소되고 사라지는 확대/축소 선택 방법에 대해 알려주세요!

    plt.figure(figsize=(8, 8), dpi=128) 에 대해 의견을 말해야했습니다  대화식 버전이 어떤 이유로 작동하거나 그렇지 않으면 다음과 같이 폭발했습니다.

    RuntimeError: In set_size: Could not set the fontsize
    
    

  • 이전 compilation - VB6 컴파일 된 실행 파일의 크기를 줄이는 방법은 무엇입니까?
  • 다음 macos - travis ci로 캐시 브루 빌드