2015-03-04 6 views
7

वर्णित लाइन चार्ट बनाने के लिए जावाफ़ैक्स 15 मिनट लेता है जो मेरे कार्य के लिए काम नहीं करता है।65000 डेटा पॉइंट्स के साथ JavaFX LineChart के साथ प्रदर्शन समस्या

अच्छे पुराने स्विंग और जेएफरी चार्ट का उपयोग करके समान कार्यान्वयन चार्ट बनाने के लिए 1.5 सेकंड लगते हैं।

लेकिन मैं अभी भी एक जावाएफएक्स को लागू करना चाहता हूं।

public class FXMLController implements Initializable { 

@FXML 
private Label statusbar; 
@FXML 
public LineChart lineChart; 
@FXML 
public Button connect; 
@FXML 
public MenuItem options; 
@FXML 
public NumberAxis xAxis; 
@FXML 
NumberAxis yAxis; 

@FXML 
private void connect(ActionEvent event) { 

} 
public static FileChooser fileChooser = new FileChooser(); 
public static String path; 
public static XYChart.Series<Integer, Integer> dataSeries = new XYChart.Series<Integer, Integer>(); 
public static int y = 0; 
public static XYChart.Data<Integer, Integer> data; 


@FXML 
private void open(ActionEvent event) { 
    fileChooser.setTitle("Open Resource File"); 
    fileChooser.getExtensionFilters().addAll(
      new ExtensionFilter("Text Files", "*.txt"), 
      new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"), 
      new ExtensionFilter("Audio Files", "*.wav", "*.mp3", "*.aac"), 
      new ExtensionFilter("All Files", "*.*")); 
    File selectedFile = fileChooser.showOpenDialog(new Stage()); 
    if (selectedFile != null) { 
     path = selectedFile.getAbsolutePath(); 
     System.out.println(path); 
     try { 
      ReadingFromFile.readFile(path); 

     } catch (IOException ex) { 
      Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

@FXML 
private void close(ActionEvent event) { 

} 

@FXML 
private void getconnect(ActionEvent event) { 

} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    xAxis.setLabel("Tick"); 
    xAxis.setTickUnit(100); 
    yAxis.setLabel("Signal"); 
    xAxis.setForceZeroInRange(false); 
    lineChart.setLegendVisible(false); 
    lineChart.setCreateSymbols(false); 
    lineChart.setAnimated(false); 
    lineChart.getData().add(dataSeries); 
    } 
} 

और फ़ाइल से पढ़ने:

public class ReadingFromFile extends FXMLController { 

public static String s = null; 
public static String[] str; 
public static int parseInt; 

public static void readFile(String filename) 
     throws IOException { 

    BufferedReader br = new BufferedReader(new FileReader(filename)); 
    try { 
     StringBuilder sb = new StringBuilder(); 
     String line = br.readLine(); 

     while (line != null) { 
      sb.append(line); 
      sb.append(System.lineSeparator()); 
      line = br.readLine(); 

      System.out.println(line); 
      try { 
       str = line.split(" "); 
       for (int i = 0; i < str.length; i = i + 2) { 
        s = str[i + 1] + str[i]; 
        parseInt = Integer.parseInt(s, 16); 
        javafx.application.Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 

          data = new XYChart.Data<Integer, Integer>(y, parseInt); 
          //data.setNode(new HoveredThresholdNode(0, second, "")); 
          dataSeries.getData().add(data); 
          y++; 
         } 

        }); 
       } 
      } catch (java.lang.NullPointerException ex) { 
       System.out.println("тут ноль!!!"); 

      } 

     } 

    } finally { 

     br.close(); 
    } 

} 

} 
+2

पहला अनुकूलन श्रृंखला में सभी डेटा बिंदुओं को एक समय में जोड़ना होगा। तो 'सूची >' बनाएं, अपने लूप में उस सूची में सभी डेटा पॉइंट जोड़ें, और फिर जब आप पूरा कर लें, तो केवल एक 'Platform.runLater (...) ' 'dataSeries.getData() के साथ। addAll (...) 'और सूची में पास करें। आप अभी भी यह काम करने में सक्षम नहीं हो सकते हैं, हालांकि; जावाएफएक्स चार्ट एपीआई एक अत्यधिक दृश्य घटक है, सीएसएस के साथ प्रत्येक डेटा बिंदु से जुड़े नोड (ओं) पर लागू होता है। यह वास्तव में वास्तव में देखे जा सकने वाले डेटा से काफी अधिक डेटा के लिए डिज़ाइन नहीं किया गया है। –

+0

@James_D ठीक है, यह थोड़ा सा मदद करता है। अब 1 मिनट और 25 सेकंड। लेकिन यह अभी भी बहुत लंबा है (( – sabracadabra

+1

ठीक है, पहले अनुकूलन पर प्रदर्शन में 10 गुना वृद्धि एक बहुत अच्छी शुरुआत है। यदि आप अपना प्रश्न संपादित करने के लिए एक [पूर्ण उदाहरण] शामिल करने के लिए शायद यहां उपयोगी सहायता प्राप्त करने की अधिक संभावना है। (http://stackoverflow.com/help/mcve) (जिसे आपको शायद स्क्रैच से बनाने की आवश्यकता है)। आप कोड के केवल कुछ दर्जन लाइनों के साथ एक बड़े 'लाइन चार्ट' के साथ निष्पादन योग्य उदाहरण बनाने में सक्षम होना चाहिए, अधिकतर –

उत्तर

3

मैं एक ऐसी ही समस्या का सामना करना, सेकंड के हर जोड़े को एक लाइन चार्ट को 1,00,000 अंक जोड़ने

यहाँ मेरी कोड है। हमने इसे Ramer–Douglas–Peucker algorithm का उपयोग करके हल किया है, इससे उपयोगकर्ता के ध्यान के बिना लाइन में अंकों की संख्या कम हो जाती है। मुझे एलजीपीएल लाइसेंस के तहत JTS topology suite में तैयार किए गए कार्यान्वयन मिले।

यहां मेरा परीक्षण कोड है।

public class ChartUpdate extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 

     NumberAxis xAxis = new NumberAxis(0, 50_000, 5000); 
     xAxis.setAutoRanging(false); 
     NumberAxis yAxis = new NumberAxis(-1, 1, 25); 
     yAxis.setAutoRanging(false); 
     LineChart<Number, Number> graph = new LineChart<>(xAxis, yAxis); 
     graph.setAnimated(false); 
     graph.setCreateSymbols(false); 
     graph.setLegendVisible(false); 
     Series<Number, Number> series = new Series<>(); 
     stage.setScene(new Scene(graph)); 

     GeometryFactory gf = new GeometryFactory(); 

     long t0 = System.nanoTime(); 
     Coordinate[] coordinates = new Coordinate[100_000]; 
     for (int i = 0; i < coordinates.length; i++) { 
      coordinates[i] = new Coordinate(i, Math.sin(Math.toRadians(i/100))); 
     } 
     Geometry geom = new LineString(new CoordinateArraySequence(coordinates), gf); 
     Geometry simplified = DouglasPeuckerSimplifier.simplify(geom, 0.00001); 
     List<Data<Number, Number>> update = new ArrayList<Data<Number, Number>>(); 
     for (Coordinate each : simplified.getCoordinates()) { 
      update.add(new Data<>(each.x, each.y)); 
     } 
     long t1 = System.nanoTime(); 

     System.out.println(String.format("Reduces points from %d to %d in %.1f ms", coordinates.length, update.size(), 
       (t1 - t0)/1e6)); 
     ObservableList<Data<Number, Number>> list = FXCollections.observableArrayList(update); 
     series.setData(list); 
     graph.getData().add(series); 

     stage.show(); 

    } 
} 
+0

एफवाईआई: जेटीएस टोपोलॉजी सूट लिंक मर चुका है। मुझे यहां एक लिंक मिला: https://locationtech.github.io/jts/ यदि यह वही है। अनिश्चित। –

संबंधित मुद्दे